C#-- ??、 ?、 ?: 、?.、?[ ](轉載)
阿新 • • 發佈:2020-04-27
1. 可空型別修飾符(?)
引用型別可以使用空引用表示一個不存在的值,而值型別通常不能表示為空。
例如:string str=null; 是正確的,int i=null; 編譯器就會報錯。
為了使值型別也可為空,就可以使用可空型別,即用可空型別修飾符"?"來表示,表現形式為"T?"
例如:int? 表示可空的整形,DateTime? 表示可為空的時間。 T? 其實是System.Nullable(泛型結構)的縮寫形式,也就意味著當你用到T?時編譯器編譯時會把T?編譯成System.Nullable的形式。
例如:int?,編譯後便是System.Nullable的形式。
2. 三元(運算子)表示式(?:)
例如:x?y:z 表示如果表示式x為true,則返回y;
如果x為false,則返回z,是省略if{}else{}的簡單形式。
3. 空合併運算子(??)
用於定義可空型別和引用型別的預設值。
如果此運算子的左運算元不為null,則此運算子將返回左運算元,否則返回右運算元。
例如:a??b 當a為null時則返回b,a不為null時則返回a本身。
空合併運算子為右結合運算子,即操作時從右向左進行組合的。
如,“a??b??c”的形式按“a??(b??c)”計算。
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中,引入了一個 ?. 的運算子,前面的程式碼可以改成如下形式:
int? firstX = points?.FirstOrDefault()?.X;
從這個例子中我們也可以看出它的基本用法:如果物件為NULL,則不進行後面的獲取成員的運算,直接返回NULL
需要注意的是,由於"?."運算子返回的可以是NULL,當返回的成員型別是struct型別的時候,"?."和"."運算子的返回值型別是不一樣的。
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();
(這個不太清楚,感覺微軟語法糖用過頭了。)
本質:都使用了語法糖,在編譯階段編譯器會把特殊符號先轉譯成原始狀態再編譯。
原文:https://www.cnblogs.com/hao-1234-1234/p/6168524.html