C#6.0 运算符 '?' ,'??
可空类型与运算符
int? nullableInt;
int? 是System.Nullable<int>的缩写。
运算符
对于简单类型(如int)可以使用+、-等运算符来处理数值,而对于对应的可空类型也可以:包含在可空类型的数值会隐式转换为需要的类型,使用适当的运算符。(也适用于结构和自己的运算符
int ? op1 =1;
int ? result = op1 *2;//注意 result的类型为:int?
??运算符【空间结合运算符】(null coalescing operator)
这是一个二元运算符,允许给肯能等于null的表达式提供另一个值。第一个操作数不是null,
该运算符就等于第一个操作数,否则改运算符等于第二的操作数;eg:
下面这个两个表达式的作用是相同的:
op1 ?? op2
op1 == null ?op2:op1
op1可以是可空表达式,包含引用类型或者可空类型。 如果可空类型为null,??预算符就会提供默认值。
int ? op1 =null;
int result = op1*2??5;
op1是null,所以op1*2也是null。但是,??运算符检测这个情况,并把值5赋予result。这里注意,放入int的变量result不需要显示转换。??运算符会自动处理这个转换。
?.运算符
这个操作符通常称为 Elvis 运算符或者空条件运算符,有助于避免空值检查早成的代码歧义。
int count =0;
if(customer.orders !=null)
{
count = customer.orders.Count();
}
如果只编写这段代码,但客户没有订单(null)就会抛出 System.ArgumentNullException:
int count =customer.orders.Count();
int? count = customer.orders?.Count();//int ? 设置 count 为Null 不抛出异常;
空条件运算符的另一个作用是触发事件:
var onChanged = OnChanged;
if(onChanged!=null)
{
onChanged (this,args);
}
这种模式线程不安全的,有情况:检测null完成后,退订最后一个事件处理程序,抛出异常
可用下面替换:
OnChanged?.Invoke(this,args);