首先,我为这个问题中使用的标题道歉,因为我甚至不知道如何询问它以及如何搜索它,所以它可能存在于某个地方,类似于这个问题.
我最近在Visual Studio 2015上找到了一个我从未见过的潜在修复程序.在构建EventHandlers时,我通常会这样做:
public event EventHandler MyEvent; internal void onMyEvent(EventArgs eventArgs) { if(MyEvent != null) { MyEvent(this,eventArgs); } }
但是现在,Visual Studio 2015将使if语句和相应的括号灰显,并且在悬停时会显示一条消息,指出可以简化委托调用.简化版本看起来像这样:
public event EventHandler MyEvent; internal void onMyEvent(EventArgs eventArgs) { MyEvent?.Invoke(this,eventArgs); }
这究竟如何运作?不会因为调用null之外的方法而抛出异常,或者代码在’?’之前停止执行一片空白?
另外,我可以用’?’替换检查变量/方法/方法是否为null的每个if语句,而不考虑代码的可读性?
旁注:我假设这是来自新版本的C#,6.0,因为我以前从未见过它.如果我错了,请纠正我
解决方法
正如它指出的那样,C#6的功能被称为
Null-conditional Operators.
internal void onMyEvent(EventArgs eventArgs) { EventHandler expr_07 = this.MyEvent; if (expr_07 != null) { expr_07(this,eventArgs); } }
如您所见,这是一个纯粹的编译器功能..它只是将您的代码重写为传统的空检查.
要回答你的问题(虽然我猜你已经通过查看代码来解决这个问题):
Wouldn’t an Exception be thrown due to be invoking a method out of
null or the code stops executing if the expression before ‘?’ is null?
当eventhandler为null时,不会抛出异常.当一个对象出现之前,代码才会被执行?一片空白.
现在直到这一点,这只是一个方法调用.显然,如果你想要一个带有Null条件运算符的表达式结果的值,它有点复杂:如果它是一个引用类型,那么你的变量保持为null,但如果它是一个值类型那么它将自动为空,如果您使用’?’的对象也将为null operator为null.
这是针对这种情况的解编译代码:
Program.Customer[] array = new Program.Customer[10]; if (array == null) { int? arg_33_0 = null; } else { Program.Customer expr_1A = array[0]; if (expr_1A == null) { int? arg_33_0 = null; } else { new int?(expr_1A.IntField); } }