gpt4 book ai didi

c# - C# 6.0/新空检查语法的新语法差异?

转载 作者:太空狗 更新时间:2023-10-29 20:58:23 25 4
gpt4 key购买 nike

首先,对于这个问题中使用的标题,我深表歉意,因为我什至不知道如何询问它,也不知道如何搜索它,所以它可能在某个地方,与此类似的问题一个。


我最近在 Visual Studio 2015 上发现了一个我以前从未见过的潜在修复。在构建 EventHandlers 时,我通常会这样做:

public event EventHandler MyEvent;

internal void onMyEvent(EventArgs eventArgs) {
if(MyEvent != null) {
MyEvent(this, eventArgs);
}
}

但现在,Visual Studio 2015 将 if 语句和相应的括号变灰,并在悬停时显示一条消息,说明可以简化委托(delegate)调用。简化版本看起来像这样:

public event EventHandler MyEvent;

internal void onMyEvent(EventArgs eventArgs) {
MyEvent?.Invoke(this, eventArgs);
}

这究竟是如何运作的?如果在 ' 之前的表达式?' 为空?

此外,我能否将检查变量/方法/方法是否为 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?

当您的事件处理程序为空时,不会抛出异常。当 ? 之前的对象时,代码将不会执行。为空。

到目前为止,这只是一个方法调用。显然,如果你想分配一个值,该值是带有 Null 条件运算符的表达式的结果,它会稍微复杂一点:如果它是引用类型,那么你的变量将保持为 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);
}
}

关于c# - C# 6.0/新空检查语法的新语法差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36886088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com