在C#7中,我们可以使用
if (x is null) return;
代替
if (x == null) return;
使用新方法(以前的示例)比旧方式有任何优势吗?
语义有什么不同吗?
这只是一个品味问题吗?如果没有,我什么时候应该使用另一个?
参考:C#7.0中的新功能。
答案
Update: 罗斯林编译器已更新以使两个运营商的行为相同当没有超负荷运算符时 。请看当前编译器结果中的代码((M1
和M2
在代码)中显示没有超载平等比较时发生的情况。他们俩现在都有表现更好的==
行为。如果有超载平等比较,代码仍然有所不同。
有关罗斯林编译器的较旧版本,请参见以下分析。
为了null
与C#6相关的习惯没有区别。但是,当您更改时,事情变得有趣null
达到另一个常数。
以此为例:
Test(1);
public void Test(object o)
{
if (o is 1) Console.WriteLine("a");
else Console.WriteLine("b");
}
测试产生a
。如果将其比较o == (object)1
您通常会写的是,它确实有很大的不同。is
考虑比较另一侧的类型。太棒了!
我觉得== null
VS.is null
恒定模式只是"偶然"非常熟悉的东西,其中的语法is
操作员和等价运算符得出相同的结果。
作为斯维克评论,is null
呼叫System.Object::Equals(object, object)
在哪里==
呼叫ceq
。
伊尔为is
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments
IL_0007: ret // Return from method, possibly with a value
伊尔为==
:
IL_0000: ldarg.1 // Load argument 1 onto the stack
IL_0001: ldnull // Push a null reference on the stack
IL_0002: ceq // Push 1 (of type int32) if value1 equals value2, else push 0
IL_0004: ret // Return from method, possibly with a value
因为我们在谈论null
,没有区别,因为仅在实例上有所作为。当您超载相等运算符时,这可能会改变。