這篇文章我想復習下C#中的基元類型
關於什麼是基元類型
比較常見的問題
第一
第二
像很多園友回復的一樣
//最簡單
int a =
//較簡潔的
Int
//不簡潔的
int c = new int();
//最不簡潔
System
我們再來看下這些代碼生成的IL代碼
.entrypoint
// 代碼大小 10 (0xa)
.maxstack 1
.locals init ([0] int32 a,
[1] int32 b,
[2] int32 c,
[3] int32 d)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldc.i4.0
IL_0004: stloc.1
IL_0005: ldc.i4.0
IL_0006: stloc.2
IL_0007: ldc.i4.0
IL_0008: stloc.3
IL_0009: ret
} // end of method Program::Main
結論:它們都是申明一個int32類型的變量,並且對其進行了初始化。TW.WINgWIT.coM至於這是什麼原因呢?這裡就只能用基元類型來解釋了。我們來看下C#的基元類型和FCL以及CLS的部分關系。從下面的表中可以看出:
1:int被映射到FCL中的System.Int32中。這裡足以解釋上面四種創建變量的結果為什麼是一樣的原因。
2:string和System.Sting其實並無實質的區別,說的簡單點,string是String的一個別名。
using方式理解基元類型和FCL的關系 : 可以利用using語句來實現:
using sbyte=System.SBYTE;
using int=System.Int32;
using string=System.String;
FCL類型之間的轉換:我們知道在FCL類型變量之間可以進行相關的轉換,例如:
Int32 i=0;
Int64 j=i;//隱式轉換成Int64
下面是對應的IL代碼:我們可以看出有一人conv.i8操作,這裡就是數據類型的轉換。
thod private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代碼大小 7 (0x7)
.maxstack 1
.locals init ([0] int32 i,
[1] int64 j)
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0
IL_0003: ldloc.0
IL_0004: conv.i8
IL_0005: stloc.1
IL_0006: ret
} // end of method Program::Main
分析:從OO的角度來講,這種轉換並不是"太正常":
1:Int32和Int64是兩種不同的數據類型;
2:兩者之間並不存在繼承關系。
問題:為什麼兩者之間能夠正常轉換呢?也是因為基元類型和的關系。
類型之間的轉換提供了兩種方式:
第一:隱式轉換,如果兩個類型之間是類型安全的,則可以直接進行轉換;
第二:顯示轉換,類型之間是非安全的,需要強制轉換。
From:http://tw.wingwit.com/Article/program/net/201311/12381.html