使用int?來確保值類型也可以為null
繼上一篇“你確認(rèn)C#中TryParse比Parse好?動(dòng)手測(cè)試才知道!”后,本文繼續(xù)講《編寫高質(zhì)量代碼改善C#程序的157個(gè)建議》一書第5個(gè)建議“使用int?來確保值類型也可以為null”。喜歡本書請(qǐng)到各大商城購買原書,支持正版。
基元類型為什么需要為null?考慮兩個(gè)場(chǎng)景:
數(shù)據(jù)庫中一個(gè)int字段可以被設(shè)置為null。在C#中,值被取出來后,為了將它賦值給int類型,不得不首先判斷一下它是否為null。如果將null直接賦值給int 類型,會(huì)引發(fā)異常。
在一個(gè)分布式系統(tǒng)中,服務(wù)器需要接收并解析來自于客戶端的數(shù)據(jù)。一個(gè)int型數(shù)據(jù)可能在傳輸過程中丟失或被篡改了,轉(zhuǎn)型失敗后應(yīng)該保存為null值,而不是提供一個(gè)初始值。
類似的場(chǎng)景還有很多,所以從.NET 2.0開始,F(xiàn)CL中提供了一個(gè)額外的類型:可以為空的類型Nullable。它是一個(gè)結(jié)構(gòu)體,聲明如下:
[SerializableAttribute]
public?struct?Nullable<T>?where?T?:?struct
因?yàn)槭墙Y(jié)構(gòu)體,所以只有值引用類型才可以作為“可以為空的類型”(引用類型本身就可以為null)。一個(gè)可以為空的int類型表示為:
Nullableeint>?i?=?null;
它也可以表示為:
int??i?=?null;
語法T?是 Nullable的簡(jiǎn)寫,兩者可以相互轉(zhuǎn)換。可以為 null 的類型表示其基礎(chǔ)值類型正常范圍內(nèi)的值再加上一個(gè)null值。例如,Nullable,其值的范圍為—2147 483 648~2 147 483 647,再加上一個(gè)null值。
現(xiàn)在來看看可空類型和基元類型的互相轉(zhuǎn)換。基元類型提供了其對(duì)應(yīng)的可空類型的隱式轉(zhuǎn)換,如下所示:
int??i?=?null;
int?j?=?0;
i?=?j;
反過來,可空類型不可隱式轉(zhuǎn)換為對(duì)應(yīng)的基元類型,正確的轉(zhuǎn)換形式如下:
int??i?=?123;
int?j;
if?(i.Hasvalue)
{
??j?=?i.value;
}
else
{
??j?=?0;
)
但是,這段代碼看上去是不是有點(diǎn)煩瑣?所以,在闡述可空類型的時(shí)候,不得不提到??運(yùn)算符。??最大的用處就是將可空類型的值賦值給對(duì)應(yīng)的基元類型進(jìn)行簡(jiǎn)化,上文代碼的一個(gè)簡(jiǎn)化形式就是:
int??i?=?123;
int?j?=?i????0;
int j = i ?? 0;表示的意思是,如果i的HasValue為 true,則將i的value賦值給j:否則,就給j賦值為0。
下一篇我們接著讀《建議6:區(qū)別readonly和const的使用方法 》,歡迎關(guān)注微信公眾號(hào)【小市民在西河】。
