「?」符號使用心得筆記
說到「? 」符號功能第一個想到就是三元運算子,這個是從 C++ 時代就有的功能
C# 對「?」的使用更進一步延伸功能,以下列出四項用途
三元運算式—「? :」
先參照 MSDN 說明:?: 運算子 (C# 參考)
下面是一個普通的判斷式,結果是大於設定值 60 就顯示「合格」,不是的話就顯示「不合格」
int i = 80;
if (i >= 60)
{
Console.WriteLine("合格");
}
else
{
Console.WriteLine("不合格");
}
以下是用「?」當三元運算子簡化寫法
int i = 80;
Console.WriteLine((i>=60)?"合格":"不合格");
以「?」與「:」將式子分成三個部分
格式是:(判斷式) ? (判斷式為 True 的返回值) : (判斷式為 False 的返回值)
宣告可為 null 的型別—「T?」
這個先參考一下 MSDN 對可為 null 的實數值型別跟可為 null 的參考型別
看完有如迷之文章的官方解釋後,相信 99% 的人一定懵的一把,我用自己理解的方式解釋一下
管他哪種數值型態加上「?」就是讓該變數除了原本資料型態外可以再接受 null 數值
要注意像 string 這種原本就可以接受 null 值的就不用畫蛇添足了
參考以下的實作例子
#region 此處編譯器都會報錯
int i = null;
float f = null;
double d = null;
bool b = null;
char c = null;
#endregion
#region 改成以下就可以賦值 null
int? iNull = null;
float? fNull = null;
double? dNull = null;
bool? bNull = null;
char? cNull = null;
int? [] arryNull = new int?[255];
#endregion
null 聯合運算子—「??」「??=」
依舊參照一下 MSDN 的 ?? 和??= 運算子 (c # 參考)
意思是「??」左邊的運算式結果是 null 就回傳右邊的運算結果,不然就是回傳左邊的運算結果
就我的理解會是用在處理結果為 null 的變數做右側那邊的處理或賦值 (有些不精準 XD)
但要注意若是左邊是一個變數,那就搭配著上面可宣告 null 型別的功能一起使用
int? iNull = null;
int i = 100;
Console.WriteLine(${iNull} ?? ${i}); // output: 100
string sNull = null;
string s = "Hello";
Console.WriteLine(sNull ??= s); // output: Hello 這邊 sNull 的內容值也改變了
要注意一點是用到「??=」左側運算元只能是可為 null 的變數、屬性或是索引子元素
null 條件運算子—「?.」「?[]」
照慣例參考一下 MSDN 的 Null 條件運算子 ?. 和 ?[]
這個功能是在左邊運算元判斷為「不是 null」時,提取成員(提取[]的元素)或執行右側運算操作
這邊放個 MSDN 的例子,很經典使用範例,要注意執行判斷順序
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
另外補充一個網路範例
#region 原本執行敘操作寫法
var a = new Thread(Show);
a.Start();
if (a != null)
a.Abort();
#endregion
#region 改用?.的寫法
var a = new Thread(Show);
a.Start();
a?.Abort();
#endregion