C# 使用int? 來確保值類型也可以為null


基元類型需要為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個建議》陸敏技

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM