C# ?.運算符
這個操作符通常稱為Elvis運算符或空條件運算符,有助于避免繁雜的空值檢査造成的代碼歧義。例如,如果想得到給定客戶的訂單數(shù),就需要在設置計數(shù)值之前檢查空值:
int count =0;
if (customer.orders ! = null)
{
count = customer.orders.Count();
}
如果只編寫了這段代碼,但客戶沒有訂單(即為null),就會拋出System.ArgumenlNullException:
int count = customer.orders.Count();
使用?.運算符,會把int?count設置為null,而不會拋出一個異常。
int? count = customer.orders?.Count();
結合上一節(jié)討論的空合并操作符??與空條件運算符?.可以在結果是null時設置一個默認值。
int? count = customer.orders?.Count() ?? 0;
空條件運算符的另一個用途是觸發(fā)事件。第13章詳細討論了事件。觸發(fā)事件的最常見方法是使用如下代碼模式:
var onChanged = OnChanged;
if (onChanged != null)
{
onChanged(this, args);
}
這種模式不是線程安全的,因為有人會在null檢查己經完成后,退訂最后一個事件處理程序。此時會拋出異常,程序崩潰。使用空條件運算符可以避免這種情形:
OnChanged?.Invoke{this, args);
在C:\BeginningCSharp7\Chapterl2\Chl2CardLib\Card.cs類的=運算符重載中,使用?.運算符檢查null,可以避免在使用該方法時拋出異常。例如:
public static bool operator ==(Card cardlt Card card2)
=> (cardl?.suit == card2?.suit} && (cardl?.rank == card2?.rank);
在語句中包括空條件運算符,就清楚地表示:如果左邊的對象(在本例中是rardl或card2)不為空,就檢索右邊的對象。如果左邊的對象為空(即cardl或card2),就終止訪問鏈,返回null。
點擊加載更多評論>>