c#處理null的幾個語法糖,非常實用。(尤其是文末Dictionary那個案例,記得收藏)
??
如果左邊是的null,那麼返回右邊的運算元,否則就返回左邊的運算元,這個在給變數賦予預設值非常好用。
int? a = null; int b = a ?? -1; Console.WriteLine(b); // output: -1
??=
當左邊是null,那麼就對左邊的變數賦值成右邊的
int? a = null; a ??= -1; Console.WriteLine(a); // output: -1
?.
當左邊是null,那麼不執行後面的操作,直接返回空,否則就返回實際操作的值。
using System; public class C { public static void Main() { string i = null; int? length = i?.Length; Console.WriteLine(length ?? -1); //output: -1 } }
?[]
索引器操作,和上面的操作類似
using System; public class C { public static void Main() { string[] i = null; string result = i?[1]; Console.WriteLine(result ?? "null"); // output:null } }
注意,如果鏈式使用的過程中,只要前面運算中有一個是null,那麼將直接返回null結果,不會繼續計算。下面兩個操作會有不同的結果。
using System; public class C { public static void Main() { string[] i = null; Console.WriteLine(i?[1]?.Substring(0).Length); //不彈錯誤 Console.WriteLine((i?[1]?.Substring(0)).Length) // System.NullReferenceException: Object reference not set to an instance of an object. } }
一些操作
//引數給予預設值 if(x == null) x = "str"; //替換 x ??= "str"; //條件判斷 string x; if(i<3) x = y; else { if(z != null) x = z; else z = "notnull"; } //替換 var x = i < 3 ? y : z ?? "notnull" //防止物件為null的時候,依然執行程式碼 if(obj != null) obj.Act(); //替換 obj?.Act(); //Dictionary取值與賦值 string result; if(dict.ContainKey(key)) { if(dict[key] == null) result = "有結果為null"; else result = dict[key]; } else result = "無結果為null"; //替換 var result= dict.TryGetValue(key, out var value) ? value ?? "有結果為null" : "無結果為null";