引用類型可使用空引用表示一個不存在的值,而值類型一般不能表示爲空。
例如:string str=null; 是正確的,int i=null; 編譯器就會報錯。
爲了使值類型也可爲空,就可使用可空類型,即用可空類型修飾符"?「來表示,表現形式爲"T?」
例如:int? 表示可空的整形,DateTime? 表示可爲空的時間。
T? 實際上是System.Nullable(泛型結構)的縮寫形式,
也就意味着當你用到T?時編譯器編譯時會把T?編譯成System.Nullable的形式。
例如:int?,編譯後即是System.Nullable的形式。spa
例如:x?y:z 表示若是表達式x爲true,則返回y;
若是x爲false,則返回z,是省略if{}else{}的簡單形式。.net
用於定義可空類型和引用類型的默認值。
若是此運算符的左操做數不爲null,則此運算符將返回左操做數,不然返回右操做數。
例如:a??b 當a爲null時則返回b,a不爲null時則返回a自己。
空合併運算符爲右結合運算符,即操做時從右向左進行組合的。
如,「a??b??c」的形式按「a??(b??c)」計算。code
例如咱們要獲取一個Point序列的第一個點的X座標,第一感受會這麼寫:
int firstX = points.First().X;
可是,老鳥會告訴你,這兒沒有進行NULL檢查,正確的版本是這樣的:對象
int? firstX = null; if (points != null) { var first = points.FirstOrDefault(); if (first != null) firstX = first.X; }
正確卻是正確了,代碼取變得難讀多了。在C# 6.0中,引入了一個 ?. 的運算符,前面的代碼能夠改爲以下形式:blog
int? firstX = points?.FirstOrDefault()?.X;
從這個例子中咱們也能夠看出它的基本用法:若是對象爲NULL,則不進行後面的獲取成員的運算,直接返回NULL編譯器
須要注意的是,因爲"?.「運算符返回的能夠是NULL,當返回的成員類型是struct類型的時候,」?.「和」."運算符的返回值類型是不同的。
string
Point p = new Point(3, 2); Console.WriteLine(p.X.GetType() == typeof(int)); //true Console.WriteLine(p?.X.GetType() == typeof(int?)); //true
int? first = customers?[0].Orders.Count();
(這個不太清楚,感受微軟語法糖用過頭了。)it
本質:都使用了語法糖,在編譯階段編譯器會把特殊符號先轉譯成原始狀態再編譯。
原文連接:https://blog.csdn.net/qq_42453390/article/details/90403344編譯