C#中 ??、 ?、 ?: 、?.、?[ ] 問號

1. 可空類型修飾符(?)

引用類型可使用空引用表示一個不存在的值,而值類型一般不能表示爲空。
例如:string str=null; 是正確的,int i=null; 編譯器就會報錯。
爲了使值類型也可爲空,就可使用可空類型,即用可空類型修飾符"?「來表示,表現形式爲"T?」
例如:int? 表示可空的整形,DateTime? 表示可爲空的時間。
T? 實際上是System.Nullable(泛型結構)的縮寫形式,
也就意味着當你用到T?時編譯器編譯時會把T?編譯成System.Nullable的形式。
例如:int?,編譯後即是System.Nullable的形式。spa

2. 三元(運算符)表達式(?: )

例如:x?y:z 表示若是表達式x爲true,則返回y;
若是x爲false,則返回z,是省略if{}else{}的簡單形式。.net

3. 空合併運算符(??)

用於定義可空類型和引用類型的默認值。
若是此運算符的左操做數不爲null,則此運算符將返回左操做數,不然返回右操做數。
例如:a??b 當a爲null時則返回b,a不爲null時則返回a自己。
空合併運算符爲右結合運算符,即操做時從右向左進行組合的。
如,「a??b??c」的形式按「a??(b??c)」計算。code

4.NULL檢查運算符(?.)  

例如咱們要獲取一個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

5"?[]"運算符:

int? first = customers?[0].Orders.Count();

(這個不太清楚,感受微軟語法糖用過頭了。)it

本質:都使用了語法糖,在編譯階段編譯器會把特殊符號先轉譯成原始狀態再編譯。
 
原文連接:https://blog.csdn.net/qq_42453390/article/details/90403344編譯

相關文章
相關標籤/搜索