C# 6.0 新语法/新空检查语法的差异?
Differences in the new syntax of C# 6.0 / New null check syntax?
首先,我为这个问题中使用的标题道歉,因为我什至不知道如何询问它也不知道如何搜索它,所以它可能在那里,某个地方,一个与此类似的问题。
我最近在 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);
}
这究竟是如何工作的? Exception
不会因为调用 null
中的方法或代码 stops 执行而抛出 之前的表达式吗? ' 为空?
此外,我可以将检查变量/方法/方法是否为 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);
}
}
让它变得简单...
MyEvent?.Invoke(this, eventArgs);
中的?叫做Null Conditional Operator,用来简化代码
它们用于在调用方法或访问可枚举的索引之前测试 null,例如 Array
或 List
。
这个例子可以在关于 Null 条件运算符的页面上找到,它不言自明:
// null if customers is null
int? length = customers?.Length;
// null if customers is null
Customer first = customers?[0];
// null if customers, the first customer, or Orders is null
int? count = customers?[0]?.Orders?.Count();
首先,我为这个问题中使用的标题道歉,因为我什至不知道如何询问它也不知道如何搜索它,所以它可能在那里,某个地方,一个与此类似的问题。
我最近在 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);
}
这究竟是如何工作的? Exception
不会因为调用 null
中的方法或代码 stops 执行而抛出 之前的表达式吗? ' 为空?
此外,我可以将检查变量/方法/方法是否为 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);
}
}
让它变得简单...
MyEvent?.Invoke(this, eventArgs);
中的?叫做Null Conditional Operator,用来简化代码
它们用于在调用方法或访问可枚举的索引之前测试 null,例如 Array
或 List
。
这个例子可以在关于 Null 条件运算符的页面上找到,它不言自明:
// null if customers is null
int? length = customers?.Length;
// null if customers is null
Customer first = customers?[0];
// null if customers, the first customer, or Orders is null
int? count = customers?[0]?.Orders?.Count();