通过分析我们发现,null运算符编译后的IL代码更简短,使用了2个分支跳转,简化了判断逻辑,而if版的IL还多出来一个bool类型的V_2临时变量。
so,结论就是"?."的和三元运算符"?:"的编译结果是一样的,而且简化了if的判断。所以不管是从性能还是可读性方面考虑,"?."都是推荐的写法。
3. Example 3.1 ?[
null条件运算符不但可以使用?.的语法访问对象的属性和方法,还可以用?[ 的语法访问检测数组或包含索引器的对象是否是null。比如:
Person[] persons = null;
//?.
int? length = persons?.Length;
//?[
Person first = persons?[0];
3.2 ?.结合??
上面的persions?.Lenght返回的结果是Nullable类型的,有时候我们可能需要的是一个int类型的,那么我们可以结合空连接运算符"??"一起使用,比如:
Person[] persons = null;
//?.和??结合使用
int length = persons?.Length ?? 0;
3.3 以线程安全的方式调用事件
PropertyChangedEventHandler propertyChanged = PropertyChanged;
if (propertyChanged != null)
{
propertyChanged(this, new PropertyChangedEventArgs(nameof(Name)));
}
上面的代码一直是我们调用事件的处理方式,把事件的引用放到一个临时变量中是为了防止在调用这个委托的时候,事件被取消注册,产生null的情况。
我们从C#6以后终于可以用更简单的方式去触发事件调用了(这个埂自从C#1时代一直延续至今...):
PropertyChanged?.Invoke(propertyChanged(this, new PropertyChangedEventArgs(nameof(Name)));
4. 总结
null条件运算符是一种语法简化,同时也会做一种编译优化,优化方式和三元运算符的优化效果是一致的。语法更简化了,性能也更好了,我们有什么理由不用新语法呢。
注:相关教程知识阅读请移步到c#教程频道。










