C#6.0/New null检查语法的新语法有何不同?

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)