C#中 ??、 ?、 ?: 、?.、?[ ]、:
1. 可空類型修飾符(?)
引用類型可以使用空引用表示一個不存在的值,而值類型通常不能表示為空。?
例如:string str=null; 是正確的,int i=null; 編譯器就會報錯。?
為了使值類型也可為空,就可以使用可空類型,即用可空類型修飾符"?"來表示,表現(xiàn)形式為"T?"?
例如:int? 表示可空的整形,DateTime? 表示可為空的時間。?
T? 其實(shí)是System.Nullable(泛型結(jié)構(gòu))的縮寫形式,
也就意味著當(dāng)你用到T?時編譯器編譯時會把T?編譯成System.Nullable的形式。?
例如:int?,編譯后便是System.Nullable的形式。?
? ? ? ? ? int? a = null;
??
2. 三元(運(yùn)算符)表達(dá)式(?:)
?例如:x?y:z 表示如果表達(dá)式x為true,則返回y;
如果x為false,則返回z,是省略if{}else{}的簡單形式。 ?
3. 空合并運(yùn)算符(??)
用于定義可空類型和引用類型的默認(rèn)值。
如果此運(yùn)算符的左操作數(shù)不為null,則此運(yùn)算符將返回左操作數(shù),否則返回右操作數(shù)。
例如:a??b 當(dāng)a為null時則返回b,a不為null時則返回a本身。?
空合并運(yùn)算符為右結(jié)合運(yùn)算符,即操作時從右向左進(jìn)行組合的。
如,“a??b??c”的形式按“a??(b??c)”計算。
4.NULL檢查運(yùn)算符(?.)?
例如我們要獲取一個Point序列的第一個點(diǎn)的X坐標(biāo),第一感覺會這么寫:
????int firstX = points.First().X;
但是,老鳥會告訴你,這兒沒有進(jìn)行NULL檢查,正確的版本是這樣的:
? ?int? firstX = null; ???
???if (points != null) ????
? ?{ ?
? ??var first = points.FirstOrDefault(); ??
?????if (first != null) ???????
?????firstX = first.X; ??
? ?}?
正確倒是正確了,代碼取變得難讀多了。在C# 6.0中,引入了一個 ?. 的運(yùn)算符,前面的代碼可以改成如下形式:
????int? firstX = points?.FirstOrDefault()?.X;
從這個例子中我們也可以看出它的基本用法:如果對象為NULL,則不進(jìn)行后面的獲取成員的運(yùn)算,直接返回NULL
需要注意的是,由于"?."運(yùn)算符返回的可以是NULL,當(dāng)返回的成員類型是struct類型的時候,"?."和"."運(yùn)算符的返回值類型是不一樣的。
?????Point p = new Point(3, 2); ???
?Console.WriteLine(p.X.GetType() == typeof(int));????????//true ???
? Console.WriteLine(p?.X.GetType() == typeof(int?));????????//true
?5"?[]"運(yùn)算符:
????int? first = customers?[0].Orders.Count();
(這個不太清楚,感覺微軟語法糖用過頭了。)
本質(zhì):都使用了語法糖,在編譯階段編譯器會把特殊符號先轉(zhuǎn)譯成原始狀態(tài)再編譯。
6.“:”運(yùn)算符
當(dāng)函數(shù)又多個參數(shù)時,經(jīng)常記不清各個形參的順序,則可以用形參:實(shí)參的語法指定 形參與實(shí)參的對應(yīng)。例如:check(a:100..); 定義為:bool check(int a,....){...},表示參數(shù)a 傳入100
總結(jié)
以上是生活随笔為你收集整理的C#中 ??、 ?、 ?: 、?.、?[ ]、:的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不用再填验证码:iOS 16可自动向网站
- 下一篇: sqlserver获取当前时间_c#获取