C# ?.运算符
这个操作符通常称为Elvis运算符或空条件运算符,有助于避免繁杂的空值检査造成的代码歧义。例如,如果想得到给定客户的订单数,就需要在设置计数值之前检查空值:
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();
结合上一节讨论的空合并操作符??与空条件运算符?.可以在结果是null时设置一个默认值。
int? count = customer.orders?.Count() ?? 0;
空条件运算符的另一个用途是触发事件。第13章详细讨论了事件。触发事件的最常见方法是使用如下代码模式:
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。
点击加载更多评论>>