protect

ถ้าเอาบทความไปเผยแพร่แล้วไม่ให้เครดิต ดำเนินคดีด้วย พรบ. คอมพิวเตอร์ฉบับใหม่ ขั้นสูงสุดและไม่ยอมความครับ

วันพฤหัสบดีที่ 29 ตุลาคม พ.ศ. 2558

Assembly Module : ตอนที่ 5 TypeDef table และสมาชิก (2)


ตอนที่แล้วผมแนะนำรายละเอียดของ table ต่างๆ ที่อยู่ในส่วนของ Definition table ไปแล้ว ที่นี้เราลองมาดูเนื้อหาของ table จากตัวอย่าง code C# ดูน่ะครับ

ลองดูตัวอย่าง code ง่ายๆ น่ะครับ

using System;

namespace CTS
{
    class Program
    {
        public int thisIsField;
        public event EventHandler thisIsEvent;
        public Program()
        {

        }

        ~Program()
        {

        }

        public string thisIsProperty
        {
            get { return ""; }
            set {}
        }


        public void thisIsMethod()
        {

        }

        public void thisIsMethod(int param)
        {

        }

        public string this[int inderxer]
        {
            get { return ""; }
            set { }
        }

        static void Main(string[] args)
        {
         
        }
    }

    public class ThisIsSecondType
    {
        public ThisIsSecondType()
        {

        }
    }
}


ตัวอย่าง code นี้มาจาก code ของ Common Type System (CTS) ตอนที่ 2  แต่ผมเพิ่มเข้าไปอีกหนึ่ง Type คือ ThisIsSecondType จากนั้น compile code เพื่อที่จะได้ execute file แล้วเปิด execute file ที่ได้ด้วย ILDasm น่ะครับ จากนั้นไปที่เมนู View -> MetaInfo -> Show!

เรามาดู information ของ table TypeDef ก่อน รูปข้างล่างเป็นตัวอย่างรายละเอียดของ table TypeDef




ที่บรรทัด TypeDef #1 (02000002)
   #1 จะเป็น index ของ Type โดยตัวเลขที่เพิ่มขึ้นไปทีล่ะหนึ่งสำหรับ Type ถัดไป
  02000002 ตัวเลข 02 ที่อยู่ข้างหน้า เป็น reference code สำหรับ runtime เพื่อให้ runtime ทราบขณะกำลัง compile ว่านี้คือ table TypeDef  โดย table TypeDef จะ start ที่ 0x02 ตัวแรก 0x หมายถึงเลขฐาน16 หมาความว่าตัวเลข 02000002 เป็นตัวเลขฐาน 16 น่ะครับ

ดังนั้นตัวเลข 02000010 ฐาน 10 จะมีค่าไม่เท่ากับ 02000010 ฐาน 16 

รายละเอียดข้างล่างอีก 3 บรรทัดจะเป็นรายละเอียดของ Type
    TypeDefName เป็นชื่อของ Type โดยชื่อของ Type จะรวม namespace หน้าชื่อของ Type ใน C# code
    Flags เป็นตัวบอกชนิดของ Type จะสังเกตุว่าใน 1 Type สามารถมีได้หลาย flag
    Extends เป็นตัวบอกให้รู้ว่า Type นี้มีการสืบถอดมาจาก Type ไหนบ้าง

อันนี้สำคัญน่ะครับ Type ทุก Type ที่เขียนขึ้นภายใต้ .Net Framework จะถูกสืบทอดมาจาก Type System.Object เสมอครับ นั้นคือเหตุผลว่าทำไม Type ทุก Type ที่เราสร้างขึ้นจึงมี method ToString() ทุกครั้ง

ที่นี้ลองมาดู Type ThisIsSecondType ใน code น่ะครับ จะเป็นได้ดังรูปข้างล่าง



สิ่งที่ต่างจาก Type Program (Type แรกของ table TypeDef) คือ Index ของ Type เป็นหมายเลข 2 และเลข reference เป็น 0x02000003 (จริงๆ ก็คือ 02000003 แหละครับ แต่ใส่ 0x เพื่อย้ำให้รู้ว่านี้เป็นเลขฐาน 16)

Flags ของ Type ThisIsSecondType เราระบุว่าเป็น public ในขณะที่ Type Program เราไม่ได้ระบุดังนั้น C# compiler จะให้ Type Program มี flag เป็น NotPublic เป็นค่า default

พบกันใหม่บทความหน้าครับ
TuChay




ไม่มีความคิดเห็น:

แสดงความคิดเห็น