天天看點

C# ?問号運算符知多少

總結一下C#中問号有三種

第一:三目操作運算符【 ? : 】

問号前面的是條件,後面的是結果,條件滿足傳回冒号前面的值否則後面的值

事例

[csharp] view plain copy

<span style="white-space:pre"> </span>public int WhoBig(int a, int b) 

return a > b ? a : b; 

}

第二:基本資料類型可空辨別符【?】

聲明的變量可以為空,比如int,string,但是布爾值為空依然報錯

<span style="white-space:pre"> </span>int i = null;//報錯 

bool j = null; //報錯

第三:null合并運算符【??】

指派的結果中的變量如果為空則用??後面的值替代前面的變量,否則直接用前面的變量

如果此運算符的左操作數不為 null,則此運算符将傳回左操作數;否則傳回右操作數

<span style="white-space:pre"> </span>public string Hongyan(string a) 

string res = a; 

if (a == null) 

res = ""; 

//等價于 

res = a ?? ""; 

return res; 

如果a為空就選擇??後面的值否則前面的值

第四:null條件運算符【?.】

用于在執行成員通路 (?.) 或索引 (?[) 操作之前,測試是否存在 NULL。 這些運算符可幫助編寫更少的代碼來處理 null 檢查,尤其是對于下降到資料結構。

int? length = customers?.Length; // null if customers is null 

Customer first = customers?[0]; // null if customers is null 

int? count = customers?[0]?.Orders?.Count(); // null if customers, the first customer, or Orders is null

最後一個示例示範 NULL 條件運算符會短路。 如果條件成員通路和索引操作鍊中的某個操作傳回 NULL,則該鍊其餘部分的執行将停止。 表達式中優先級較低的其他操作将繼續。 例如,以下的示例中的 E 将始終執行,?? 和 == 操作将執行。

A?.B?.C?[0] ?? E 

A?.B?.C?[0] == E

NULL 條件成員通路的另一個用途是使用非常少的代碼以線程安全的方式調用委托。 舊方法需要如下所示的代碼:

var handler = this.PropertyChanged; 

if (handler != null) 

handler(…)

新的方法是要簡單得多:

PropertyChanged?.Invoke(e)

新方法是線程安全的,因為編譯器生成代碼以評估 PropertyChanged(僅一次),進而使結果保持在臨時變量中。

你需要顯式調用 Invoke 方法,因為不存在 NULL 條件委托調用文法 PropertyChanged?(e)。 有太多不明确的分析情況來允許它。

本文轉自 甯金峰 51CTO部落格,原文連結:http://blog.51cto.com/13243523/2046067,如需轉載請自行聯系原作者

繼續閱讀