雙問號(??)是一個單元運算符,其左右兩邊數據類型必須是相同類型或能隱形轉換類型的。意思是,首先檢測左邊的值,若爲Null,那麼整個表達式取值爲右側的值,否則爲左側的值。
例如:string s = null; Console.Write(s ?? "abc");。將打印出"abc"。
例如string s = "a";Console.Write(s ?? "abc");將打印出"a"。
下面將對項目中的一些實例進行詳細的分析並改進代碼:
示例一:<%# Eval("JBQK_DXXL").ToString() == "本科" ? Eval("JBQK_DXXLSJ") : ""%>。
這個是在數據綁定控件中很常見的綁定數據的代碼,錯誤也很明顯,當JBQK_DXXL爲null時,將報NullReferenceException異常。若不用雙問號(??)的話,修改後的代碼將類似於
<%# (Eval("JBQK_DXXL") != null && Eval("JBQK_DXXL").ToString() == "本科") ? Eval("JBQK_DXXLSJ") : ""%>
而使用雙問號(??)後,代碼將如下:
<%# (Eval("JBQK_DXXL") ?? string.Empty).ToString() == "本科" ? Eval("JBQK_DXXLSJ"): ""%>
示例二:entity.ZXX.Contains("高中")
錯誤同樣明顯,entity.ZXX爲空,報NullReferenceException異常。
不用雙問號(??)的話,需要先檢測空,if(entity.ZXX!=null)
而使用雙問號(??)代碼如下:
(entity.ZXX ?? string.Empty).Contains(item.Text)
示例三:賦予默認值
在給一個變量賦值的時候,可以用雙問號(??)來起到設置默認值的作用。
string s = entity ?? string.Empty;
總結下來,就是省去了if(XXX==null)的判斷,特別是在數據控件中綁定數據時,由於不能寫語句,只能寫表達式,更加發揮出了雙問號(??)的作用。