基元類型需要為null,考慮兩個場景:
1、數據庫中一個int字段可以被設置為null。在C#中,值被取出來后,需要先判斷一下是否為null,不然把null賦值給int類型會引發異常。
2、在一個分布式系統中,服務器需要接收並解析來自客戶端的數據,一個int類型數據在傳輸過程中可能會丟失或者被篡改,轉型失敗后應該保存為null值,而不是提供一個初始值。
從.net 2.0開始,FCL提供了一個可以為空的類型Nullable<T>,它是結構體:
[Serializable] [TypeDependency("System.Collections.Generic.NullableComparer`1")] [TypeDependency("System.Collections.Generic.NullableEqualityComparer`1")] public struct Nullable<T> where T : struct
一個可以為空的int類型聲明:
1 Nullable<int> i1 = null; 2 int? i2 = null;
int?是Nullable<int>的簡寫,兩者可以相互轉換。
可以為null的類型表示其在基礎值類型的正常范圍內的值再加上一個null值。例如,Nullable<int>,其值的范圍為-2147483648~2147483647,再加上一個null值。
基元類型可以直接隱式轉換為可空類型:
1 int? i = null;//可空類型 2 int j = 0;//基元類型 3 i = j;
反過來,可空類型轉換成基元類型不能隱式轉換,因為可空類型(值范圍更大)可能為null值,不能賦值給基元類型,需要判斷是否為null:
1 int? i = null;//可空類型 2 int j;//基元類型 3 if (i.HasValue)//判斷是否有值 4 { 5 j = i.Value;//把值賦值給基元類型 6 }
其中第三行到第六行可用??運算符簡寫:
1 int? i = null;//可空類型 2 int j;//基元類型 3 j = i ?? 0;//如果i有值則將i.Value賦值給j;否則就給j賦值為0.
參考:《編寫高質量代碼改善C#程序的157個建議》陸敏技