System.Nullable可空值類型---《clr via c#》筆記
2012-02-02 17:08 海不是藍 閱讀(548) 評論(0) 收藏 舉報System.Nullable |
Clr對可空值類型支持的類,System.Nullable
它的內部實現就不啰嗦了,自己去看。
它有重要的1個方法和2個屬性
public T GetValueOrDefault();
獲取該類型的默認值
public bool HasValue { get; }
返回一個布爾值,對象是否包含值
public T Value { get; }
得到對象的值,如果對象是NULL,就會拋出異常。
try
{
System.Nullable<Int32> i = 2;
Console.WriteLine(i.HasValue);
Console.WriteLine(i.Value);
i = null;
Console.WriteLine(i.GetValueOrDefault());
Console.WriteLine(i.HasValue);
Console.WriteLine(i.Value);
}
catch (InvalidOperationException ex)
{
Console.WriteLine(ex.Message);
}
在使用使用可空值類型的時候應該先判斷是否存在值,而不能像上面那樣直接去獲取值。
C#對可空值類型的支持 |
簡單的語法
System.Nullable<Int32> i = 2;
等同于
Int32? i = 2;
可空值類型的轉換和轉型
Int32? i = 2;
Int32 j = (Int32)i;
上面是從可空值類型顯式轉換為Int32
Int32? i = 2;
double? d = i;
上面是可空值類型的轉型,從Int32?轉到Double?
然后就是可空值類型的各種操作符,應該和普通類型的操作符使用差不多吧,只是clr是相應對于可空值類型生成很多Il相關的處理代碼。
語法糖!空接合操作符?? |
??的作用:它要獲取2個操作數,假如左邊的操作數不為null,那么返回這個操作數的值,如果左邊的操作數為null,那么就返回右邊的。
??奇妙的地方在于它既可以用于引用類型,又可以用于可空值類型。
Int32? i = 2;
//Int32? j = i.HasValue ? i.Value : 123;
Int32 j = i ?? 123;
上面注釋掉的代碼和下面那一行的代碼等效的。
再看看引用類型的??
string str = null;
string str1 = str ?? "abc";
??的優(yōu)點
1.在拉姆達這些里面使用能讓代碼變得簡介和容易理解。
2.?書上貌似沒說什么了,88
CLR對可空值類型的特殊關照 |
可空值類型的裝箱拆箱
由于這個null,讓可空值類型的裝箱拆箱變得不那么順利,但是clr對她特殊關照了下。
//對Int32? I進行裝箱,要么返回Null,要么返回已裝箱的I
Int32? i = null;
object obj = i;
對于已經裝箱的值類型引用是null,而且要把他拆分為Nullable<T>,那么clr會將Nullable<T>的值設為null。
object obj = null;
Int32? i = (Int32?)obj;
Console.WriteLine(i ?? 0);
最后輸出0。
CLR撒謊了!
在一個Nullable<T>對象上調用GetType()時,CLR會撒謊說類型是T,而不是Nullable<T>。
Int32? i = 2;
Console.WriteLine(i.GetType());
輸出的是System.Int32。
浙公網安備 33010602011771號