一、?? null-coalescing operator
例如:int y = x ?? -1;
意指將x值指定給y,但如果x值為null時,則將-1指定給y。
二、??= null-coalescing assignment operator
1 2 3 4 5 6 7 8
| string x = null; x ??= "a";
string y = "b"; y ??= "c";
Console.WriteLine($"x = {x}"); Console.WriteLine($"y = {y}");
|
意指如果 x 為 null 時,則將 “a” 指定給 x。
另一例為,如果 y 不為 null 時,則不需將 “c” 指定給 y。
三、?: ternary conditional operator
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| using System;
namespace ConsoleApp1 { class Program { static void Main(string[] args) { int input = 100; string classify = input > 0 ? "positive" : "negative"; Console.WriteLine(classify); } } }
|
執行結果為
說明:
判斷 input 是否大於零,是的話將 positive 字串傳給 classify,
否則將 negative 字串傳給classify。
另一個例子
1 2 3 4 5 6 7 8 9 10 11 12 13
| using System;
namespace ConsoleApp1 { class Program { static void Main(string[] args) { Nullable<DateTime> foo; foo = true ? (Nullable<DateTime>)null : new DateTime(0); } } }
|
四、?. and ?[] null-conditional operators
這是在 C# 6.0 所提供的功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| using System;
namespace ConsoleApp1 { class Program { static void Main(string[] args) { string letterA = "abc"; int? lengthA = letterA?.Length; Console.WriteLine(lengthA);
string letterB = null; int? lengthB = letterB?.Length; Console.WriteLine(lengthB);
Console.ReadKey(); } } }
|
當 letterA 為 null 時,則回傳 null 給 lengthA,
否則就接著去取 letterA.Length 的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| using System;
namespace ConsoleApp1 { class Program { static void Main(string[] args) { int[] a = new int[] { 0, 1, 2, 3, 4 }; int[] b = null;
if (a?[2] is int result) { Console.WriteLine(result); } else { Console.WriteLine("null"); } } } }
|
執行結果為
說明:
當陣列 a 為 null 時,則回傳 null,
否則就接著去取 a.[2] 的值。
參考資料:
int? id 类型问号变量名的含义
可為 Null 的類型 (C# 程式設計手冊)
[問題] 「??」符號語法
C# Operators
Nullable types (C# Programming Guide)
Value Types and Reference Types