問題一:Nullable<T>可賦值為null
先看兩行C#代碼
int? i1 = null; int? i2 = new int?();
int? 即Nullable<int>,就像int之于Int32;
Nullable<T>是非常特殊結(jié)構(gòu)類型,它可賦值為null(所以此前我還以為是引用類型),其本質(zhì)是等同于new;
通過調(diào)試可發(fā)現(xiàn)上述兩個(gè)值均為null,但是事實(shí)上我們卻可以調(diào)用他們的一些屬性方法比如“HasValue”,由此可見“=null“只是障眼法罷了;
此時(shí)如果調(diào)用他們的”Value“屬性將引發(fā)”InvalidOperationException“異常,注意不是空引用異常,異常信息為”其他信息: 可為空的對(duì)象必須具有一個(gè)值。”;
建議對(duì)于此類型的取值使用“GetValueOrDefault”方法來獲取,而不是判斷HasValue后去Value值;
其次建議不進(jìn)行” == null “的邏輯判斷,應(yīng)使用HasValue屬性。
問題二:Nullable<T> 可賦值為 T類型
仍然看兩行C#代碼
int? iNull = 2; int i = (int)iNull;
非常常見的代碼,但是每行代碼都包含了類型,“int?”與int之間的隱式轉(zhuǎn)換與顯示轉(zhuǎn)換,而支持可空類型轉(zhuǎn)換的就是Nullable<T>提供了兩個(gè)方法:
public static explicit operator T(Nullable<T> value); public static implicit operator Nullable<T>(T value);
operator是運(yùn)算符重載,因而這倆貨也可以看成是對(duì)“=”的運(yùn)算符重載,explicit支持了顯示轉(zhuǎn)換,implicit支持了隱式轉(zhuǎn)換,使用如下:
class UserInfo { public int ID { get; set; } public string Name { get; set; } public static explicit operator UserInfo(int id) { Console.WriteLine("獲取用戶ID為【{0}】的User對(duì)象", id); return new UserInfo { ID = id }; } public static implicit operator UserInfo(string name) { Console.WriteLine("獲取用戶名為【{0}】的User對(duì)象", name); return new UserInfo { Name = name }; } }調(diào)用:
UserInfo user1 = (UserInfo)2; UserInfo user2 = "bajie";
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注