C Sharp syntax sugar

 

一、?? 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}"); // x = a
Console.WriteLine($"y = {y}"); // y = b

意指如果 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