[C#] 「?」符號使用心得筆記

「?」符號使用心得筆記

說到「? 」符號功能第一個想到就是三元運算子,這個是從 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