標籤:os sp strong on bs amp ef as line
Microsoft在CLR中引入了可空實值型別(nullable value type)的概念。
FCL中定義System.Nullable<T>類如下:
[Serializable,StructLayout(LayoutKind.Sequential)]
public struct Nullable<T> where T: struct {
private Boolean hasValue=false;
internal T value=default(T);
………………(略)
}
一、 C#對可空實值型別的支援
- Nullable<T>是實值型別,執行個體仍然是”輕量級”的。即仍然可以在棧上,執行個體的大小就是原始實值型別+Boolean欄位大小。
- Int32?等價於Nullable<Int32>。
- 一元操作符(++,+,-,--,!,~) 運算元是null,結果就是null。
- 二元操作符(+,-,*,/,%,&,|,^,<<,>>)兩個運算元中任何一個是null,結果就是null。
Int32? a=5;
Int32? b=null;
//一元操作符
a++;//6;
b=-b; //null;
//二元操作符
a=a+3;//a=9;
b=b*3;//b=null;
- 相等性操作符(==,!=)兩個運算元都是null,兩者相等;一個運算元是null這兩者不相等。兩個運算元都不是null,就比較值來判斷是否相等。
- 關係操作符(<,>,<=,>=)兩個運算元任何一個是null,結果就是false。兩個運算元都不是null,就比較值。
二、C#的空結合操作符
- 空結合操作符(null-coalescing operator),即??操作符。
- 它要擷取兩個運算元,加入左邊的運算元不為null,就返回這個運算元的值。如果左邊的運算元為null,就返回右邊的運算元的值。
- 利用空結合操作符,可以方便地變數的預設值。它既能擁有參考型別,也能用於可空實值型別。
- ??在複合情形中更好用,如:
String s= DoThing1() ?? DoThing2() ?? ”NoThing!”;
三、可空值的裝箱、拆箱與調用GetType
- 當CLR對一個Nullable<T>執行個體進行裝箱時,會檢查它是否為null。
a) 若是,CLR不實際裝箱,並返回null值;
b) 若不為null,CLR從可空類型中取出值,並對其進行裝箱。
- CLR允許將一個已裝箱的實值型別T拆箱為一個T或者一個Nullable<T>。
若已裝箱的實值型別的引用是null,且要拆箱為一個Nullable<T>,那麼CLR會將Nullable<T>的值設為null。
- Int32? x=5;
Console.WriteLine(x.GetType());//輸出System.Int32,而非System.Nullable<Int32>。
.NET 可空實值型別