c# 各種問號語法 ?
分類
建立時間: 2023年5月7日 07:02
更新時間: 2023年9月14日 08:39
說明
我想最基本的你應該知道三元運算子 var a = true ? 1 : 2;
,但還有另外幾個 ??
, ??=
, ?.
, ?[]
。本篇將介紹這些語法。
?:
先從基本的開始說起
int age = 25;
string message;
if (age >= 18)
{
message = "You are an adult.";
}
else
{
message = "You are a minor.";
}
Console.WriteLine(message);
這是一段檢查是否成年的判斷式,使用三元運算式後就可以簡化如下
int age = 25;
string message = age >= 18 ? "You are an adult." : "You are a minor.";
Console.WriteLine(message);
?? 和 ??=
這兩個之前在 深入淺出 C# 4/e 第11章 物件之死 心得分享 曾提到過。
??
null 聯合運算子 ??,檢查如果值是 null 就回傳替代值
Program.cs
using (var stringReader = new StringReader(""))
{
// 當 nextLine 是 null 時,指派空字串給它
var nextLine = stringReader.ReadLine() ?? String.Empty;
Console.WriteLine("Line length is: {0}", nextLine.Length);
}
??=
看起來有點類似 +=,但實際用途同上,當值是 null 時就指派值給變數、屬性或欄位
Program.cs
using (var stringReader = new StringReader(""))
{
var nextLine = stringReader.ReadLine();
// 當 nextLine 是 null 時,指派空字串給它
nextLine ??= "";
Console.WriteLine("Line length is: {0}", nextLine.Length);
}
?. 和 ?[]
這兩個是 Null 條件運算子,主要是為了避免存取屬性和陣列索引遇到 null 導致發生 null 例外,詳細可參考 Null-conditional operators ?. and ?[]。
- 如果
a
的計算結果為null
,則a?[x]
或a?.x
的結果為null
。 - 如果
a
的計算結果為非null
,則a?[x]
或a?.x
的結果會分別與a[x]
或a.x
的結果相同。
以下擷取 Null-conditional operators ?. and ?[] 的範例
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
主要看 return setsOfNumbers?[indexOfSetToSum]?.Sum() ?? double.NaN;
這行。
- 這行程式會先檢查
setsOfNumbers
是不是null
。 - 如果不是
null
,再接著檢查setsOfNumbers[indexOfSetToSum]
是不是null
。 - 如果不是
null
,就會得到setsOfNumbers[indexOfSetToSum].Sum()
的值。 - 如果前面任何一個情況檢查到是
null
,整段setsOfNumbers?[indexOfSetToSum]?.Sum()
就是null
。 - 當
setsOfNumbers?[indexOfSetToSum]?.Sum()
是null
時,這行程式就會執行return double.NaN;
。
備註:List<double[]>
就是可以存取好幾組 double 陣列的串列。
var numberSets = new List<double[]>
{
new[] { 1.0, 2.0, 3.0 },
null
};
如上,第1組 double[]
為 new[] { 1.0, 2.0, 3.0 }
,第2組 double[]
為 null
。
觀看次數: 1840
?c#????=?.?:?[]conditionconditionalnulloperatoroperatorsternary三元運算子
一杯咖啡的力量,勝過千言萬語的感謝。
支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!