C# 運算符?、??=、 ?、??、?: 各種問號的用法及說明

C# 運算符?、??=、 ?、??、?: 各種問號的用法及說明

可空類型修飾符(?):

引用類型可以使用空引用表示一個不存在的值,而值類型通常不能表示為空,例如:string str=null;是正確的。int i=null;編譯器將報錯。為了使值類型也可為空,可空類型出現了,可空類型使用可空類型修飾符?來表示,表現形式為T?。例:int?表示是可空的整形,DateTime?表示為可空的時間。T?其實是System.Nullable(泛型結構)的縮寫形式,也就意味著當你用到T?時編譯器在編譯時會把T?編譯成System.Nullable的形式,例如:int?,編譯後便是System.Nullable的形式。

int a; //a<>null
int ?b; //b=null
int ?c = b+1; //c=null;

空合併運算符(??):

用於定義可空類型和引用類型的默認值。如果此運算符的左操作數不為 null,則此運算符將返回左操作數;否則返回右操作數。 例:a??b,當a為null時則返回b,a不為空時返回a本身。空合併運算符為右結合運算符,即操作時從右向左進行組合的。如,“a??b??c”的形式按“a??(b??c)”計算。

int?a=null; int b;(聲明a和b)
b=a??2; //b=2;
a=6;b=a??8;//b=6;

三元(運算符)表達式(?:)

條件運算符 (?:) 通常被稱為三元條件運算符,用於計算 Boolean 表達式,並根據 Boolean 表達式的計算結果為 true 還是 false 來返回計算兩個表達式其中之一的結果。

int a=1>0?1:0 //a=1;

null 合併賦值運算符 ??=

適用於 C# 8.0 及更高版本,只有在左操作數計算為 null 時,null 合併賦值運算符 ??= 才將其右操作數的值分配給左操作數。 如果左操作數的計算結果為非 null,則 ??= 運算符不會計算其右操作數。

List numbers = null;
int? a = null;
(numbers ??= new List()).Add(5);
Console.WriteLine(string.Join(" ", numbers)); // output: 5
numbers.Add(a ??= 0);
Console.WriteLine(string.Join(" ", numbers)); // output: 5 0
Console.WriteLine(a); // output: 0

Null 條件運算符 ?. 和 ?[]

Null 條件運算符在 C# 6 及更高版本中可用,僅當操作數的計算結果為非 null 時,null 條件運算符才會將成員訪問 ?. 或元素訪問 ?[] 運算應用於其操作數。 如果操作數的計算結果為 null,則應用運算符的結果為 null。 Null 條件成員訪問運算符 ?. 也稱為 Elvis 運算符。

NULL 條件運算符采用最小化求值策略。 也就是說,如果條件成員或元素訪問運算鏈中的一個運算返回 null,則鏈的其餘部分不會執行。 在以下示例中,如果 A 的計算結果為 null,則不會計算 B;如果 A 或 B 的計算結果為 null,則不會計算 C:

double SumNumbers(List<double> setsOfNumbers, int indexOfSetToSum)
{
return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
}
var sum1 = SumNumbers(null, 0);
Console.WriteLine(sum1); // output: NaN
var numberSets = new List<double>
{
new[] { 1.0, 2.0, 3.0 },
null
};
var sum2 = SumNumbers(numberSets, 0);
Console.WriteLine(sum2); // output: 6
var sum3 = SumNumbers(numberSets, 1);
Console.WriteLine(sum3); // output: NaN
/<double>/<double>


分享到:


相關文章: