筆者近期在寫.Net項目的時候,偶遇了不少比較有趣的C#小知識點(小標記符或者是優雅代碼的書寫方式),今天摘記一個有趣的變量聲明方式:int? x=null;ide
int? x表示的是聲明瞭一個能夠爲null的int類型的變量,爲何須要這麼作?由於int 屬於值類型變量,理論上是不能爲null的,可是咱們經過這種方式就能夠容許x爲null了。ui
x爲null能作些什麼?首先,你能夠進行這樣的判斷了:code
if(x==null){} if(x!=null){}
判斷一個方法調用的值是否拿到了?或者是一個標誌變化的變量是否變化了?等等。而且,還能夠經過這樣的變量進行以下的調用:文檔
using System; class NullableExample { static void Main() { int? num = null; // Is the HasValue property true? if (num.HasValue) { Console.WriteLine("num = " + num.Value); } else { Console.WriteLine("num = Null"); } // y is set to zero int y = num.GetValueOrDefault(); // num.Value throws an InvalidOperationException if num.HasValue is false try { y = num.Value; } catch (InvalidOperationException e) { Console.WriteLine(e.Message); } } }
以及判斷它是否有值:get
int? x = 10; if (x.HasValue) { System.Console.WriteLine(x.Value); } else { System.Console.WriteLine("Undefined"); }
綜上,這種命名方式其實意義在於:咱們若是採用的是值變量進行咱們的方法調用成功與否的標識的時候,可能會遇到儘管調用失敗,可是仍然不會出現咱們預期的失敗提示(由於值變量是有默認值的)。string
最後,上官方文檔傳送門:Nullable Types (C# Programming Guide)it
PS:這種值變量也支持裝包和拆包(裝\拆包定義能夠百度下),給一段官方的示例代碼:io
The behavior of nullable types when boxed provides two advantages:function
- Nullable objects and their boxed counterpart can be tested for null:
bool? b = null;
object boxedB = b;
if (b == null)
{
// True.
}
if (boxedB == null)
{
// Also true.
}class
* Boxed nullable types fully support the functionality of the underlying type:
double? d = 44.4; object iBoxed = d; // Access IConvertible interface implemented by double. IConvertible ic = (IConvertible)iBoxed; int i = ic.ToInt32(null); string str = ic.ToString();