加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:16:04 所属栏目:百科 来源:网络整理
导读:首先,我为这个问题中使用的标题道歉,因为我甚至不知道如何询问它以及如何搜索它,所以它可能存在于某个地方,类似于这个问题. 我最近在Visual Studio 2015上找到了一个我从未见过的潜在修复程序.在构建EventHandlers时,我通常会这样做: public event EventHan
首先,我为这个问题中使用的标题道歉,因为我甚至不知道如何询问它以及如何搜索它,所以它可能存在于某个地方,类似于这个问题.

我最近在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);
        }
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读