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

首先,我为这个问题中使用的标题道歉,因为我甚至不知道如何询问它以及如何搜索它,所以它可能存在于某个地方,类似于这个问题.

我最近在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.

使用ILSpy查看生成的C#代码也是值得的:

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);
        }
    }

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...