在C#7,我们可以使用的“x is null”和“x == null”有什么区别?
if (x is null) return;
代替
if (x == null) return;
是否有任何优势,使用比旧的语法的新途径(例如前)?
语义有什么不同?
只是一个味道的问题?如果不是,何时使用这个或另一个。
在C#7,我们可以使用的“x is null”和“x == null”有什么区别?
if (x is null) return;
代替
if (x == null) return;
是否有任何优势,使用比旧的语法的新途径(例如前)?
语义有什么不同?
只是一个味道的问题?如果不是,何时使用这个或另一个。
对于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
与is null
不变模式就是东西是“意外”,很熟悉其中is
运营商的语法和平等的运营商产生同样的结果。
由于svick评论说:is null
calls System.Object::Equals(object, object)
where ==
calls ceq
。
IL为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为==
:
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
,也因为这only makes a difference on instances没有区别。
是的,这也是我对这个新功能的理解。我认为这将主要用于'switch'结构,这在c#中有一点限制。但是,从“零”这个角度来看,我认为它会以一种或另一种方式相同。 – Pikoh
我想是的。我不知道对生成的CIL有什么影响,但我想这没有什么区别。 –
@PatrickHofman [看起来像'is'调用'object.Equals(x,null)',而'=='编译为'ceq'。](http://tryroslyn.azurewebsites.net/#b:master/ f:%3Eilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 + AJhHjJ0 + UtUylimFp04AvkA ==)但结果应该与您所说的相同。 – svick
这就是我刚才看到的链接,但它不会给你太多的信息,这就是为什么我猜测OP在问这个问题。页面最重要的部分是此测试 是运算符 “is”运算符用于检查对象的运行时类型是否与给定类型兼容。换句话说,我们使用“is”运算符来验证对象的类型是我们所期望的。让我们看看它的语法: –
@SimonPrice这是关于当前版本的C#:C#6.这个问题是关于C#7,它有[模式匹配](https://blogs.msdn.microsoft.com/dotnet/2016/08/24 /什么新功能于CSHARP-7-0 /)。 –
@bigown你在寻找什么样的细节? –