C# ?問號運算子知多少

鴻雁發表於2016-03-02

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

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

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

事例

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

        public int WhoSmall(int a, int b)
        {
            return a < b ? a : b;
            //等價於
            /*if (a < b)
                return a;
            else
                return b;
             * */
        }

第二:基本資料型別可空識別符號【?】

宣告的變數可以為空,比如int,string,但是布林值為空依然報錯

事例

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

        int? k = null;//通過
        bool? m = 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)。 有太多不明確的分析情況來允許它。








相關文章