2011-06-27 67 views
4

我正在尋找在C#中實現一個模擬器。當您在C#中將枚舉強制轉換爲int時,發生了什麼?

一個我認爲是創造與他們的字節值相關聯的所有操作碼的枚舉的事情。但是,我想知道這是不是一個好主意,考慮多久我需要訪問該字節值來執行諸如將其用作查找表中的索引等等。

當你將一個枚舉拋出int,會發生什麼?這種手術有多昂貴?簡單地將我的操作碼定義爲常量字節的名稱會更謹慎嗎?

+0

取決於。該枚舉的基礎類型已經是一個int?如果是這樣,它實質上是一個無操作。該值已經存儲爲int。 –

回答

9

這是非常便宜的 - 它實際上是一個沒有操作,真的,假設枚舉有一個基礎類型int開始(這是默認值)。例如,這裏有一個樣品的程序:

using System; 

enum Foo { A, B, C }; 

class Test 
{ 
    static void Main() 
    { 
     Foo x = Foo.B; 
     int y = (int) x; 
    }  
} 

而對於Main生成的代碼(未優化):

.method private hidebysig static void Main() cil managed 
{ 
    .entrypoint 
    // Code size  6 (0x6) 
    .maxstack 1 
    .locals init (valuetype Foo V_0, 
      int32 V_1) 
    IL_0000: nop 
    IL_0001: ldc.i4.1 
    IL_0002: stloc.0 
    IL_0003: ldloc.0 
    IL_0004: stloc.1 
    IL_0005: ret 
} // end of method Test::Main 

有效鑄造是用於編譯起見 - 在存儲器中的數據已經處於合適的狀態,所以它只是需要的值複製,就像它會複製一個intint

如果底層類型枚舉的是不一個int,然後鑄造枚舉int具有如澆鑄底層類型int相同的效果。例如,如果基礎類型是long,你會在你鑄造longint通常以同樣的方式類似conv.i4結束。

5

這取決於枚舉本身是否是基於int一點,P

如果是,什麼也沒發生 - 枚舉在其int/long直到它們裝箱任何形式完整表示。從MyEnum : int < ===>int鑄造是一個空操作。您在方法重載解析等方面熟悉的大多數區別純粹是爲編譯器而存在的;在IL級別,沒有任何區別。