auh*_*aan 6 c# visual-studio c#-6.0
首先,我为这个问题中使用的标题道歉,因为我甚至不知道如何询问它以及如何搜索它,所以它可能存在于某个地方,类似于这个问题.
我最近在Visual Studio 2015上找到了一个我从未见过的潜在修复程序.建设时EventHandlers,我通常做这样的事情:
public event EventHandler MyEvent;
internal void onMyEvent(EventArgs eventArgs) {
if(MyEvent != null) {
MyEvent(this, eventArgs);
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在,Visual Studio 2015将显示if语句和相应的括号,并在悬停时显示一条消息,说明委托调用可以简化.简化版本看起来像这样:
public event EventHandler MyEvent;
internal void onMyEvent(EventArgs eventArgs) {
MyEvent?.Invoke(this, eventArgs);
}
Run Code Online (Sandbox Code Playgroud)
这究竟如何运作?不会Exception因为调用方法而被抛出,null或者代码停止执行,如果表达式在' ?之前?' 一片空白?
另外,我可以替换if检查变量/方法/方法是否null与' ? '的每个语句?',抛开代码的可读性?
旁注:我假设这是来自新版本的C#,6.0,因为我以前从未见过它.如果我错了,请纠正我
gre*_*pos 12
正如它所指出的那样,这个C#6特性被称为Null条件运算符.
使用ILSpy查看生成的C#代码也是值得的:
internal void onMyEvent(EventArgs eventArgs)
{
EventHandler expr_07 = this.MyEvent;
if (expr_07 != null)
{
expr_07(this, eventArgs);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,这是一个纯粹的编译器功能..它只是将您的代码重写为传统的空检查.
要回答你的问题(虽然我猜你已经通过查看代码来解决这个问题):
不会因为调用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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7986 次 |
| 最近记录: |