從IL上 揭開枚舉本質

我們知道類型包括兩大類:枚舉 和 結構(包括了 int double float decimal 等簡單類型),他們也都繼承於valueType,但是並非所有繼承於valueType的類型就一定是值類型 ,這個唯一特例就是System.Enum,這是一張繼承關係圖
 

所有的枚舉類型都繼承System.Enum,實現System.Enum所有方法。父類還是引用類型
繼承自他的子類確實值類型,那麼這個System.Enum和valueType一樣很特殊。
現在只能簡單說說枚舉類型和System.Enum有什麼區別:枚舉類型是值類型,在棧區分配空間,它也是一種類 卻不能被繼承(一會從IL看出原因)。Enum 是引用類型 在堆區分配空間,它本事不是枚舉類型 它卻封裝了操作枚舉類型的方法。比如          Enum.GetName();
Enum.GetValues();
Enum.GetUnderlyingType();
現在我們聲明一個枚舉:
    enum MyEnum
    {
        first,
        second=101,
        third
    }
編譯後的IL:

.class private auto ansi sealed MyEnum
extends [mscorlib]System.Enum
{
.field public static literal valuetype ConsoleApplication6.MyEnum first = int32(0)
.field public static literal valuetype ConsoleApplication6.MyEnum second = int32(0x65)
.field public static literal valuetype ConsoleApplication6.MyEnum third = int32(0x66)
.field public specialname rtspecialname int32 value__

}
我們看到“class”“sealed”就知道他是個不能繼承的類,
這裏爲什麼會有一個”private“我就不清楚了
大概是編譯器的一種約定吧,應該是internal類型,
或許是編譯器級別”private“有不同含義,
 如果定義爲public的
枚舉 IL也是public。 然後我們看到
extends [mscorlib]System.Enum
說明繼承自Enum
 [mscorlib]是包括Enum 類的.dll文件名

”first“是 共有的 靜態的 它的類型是 MyEnum ,
由於上面我沒有給他值
這裏編譯器就給了他默認的 INT32類型的 0,而定義時候我給了second 101的值
這裏編譯器給了他十六進制表示的65轉十進制就是101,
”third“也沒賦值 系統默認 前一個 值+1給他。

也可以看出枚舉的本質就是幾個靜態常量集合。

 
上述屬個人淺薄見識,不對之處請指正。
(未完待續..............................)


 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章