2016-11-18 109 views
76

在C#7,我们可以使用的“x is null”和“x == null”有什么区别?

if (x is null) return; 

代替

if (x == null) return; 

是否有任何优势,使用比旧的语法的新途径(例如前)?

语义有什么不同?

只是一个味道的问题?如果不是,何时使用这个或另一个。

Reference

+1

这就是我刚才看到的链接,但它不会给你太多的信息,这就是为什么我猜测OP在问这个问题。页面最重要的部分是此测试 是运算符 “is”运算符用于检查对象的运行时类型是否与给定类型兼容。换句话说,我们使用“is”运算符来验证对象的类型是我们所期望的。让我们看看它的语法: –

+1

@SimonPrice这是关于当前版本的C#:C#6.这个问题是关于C#7,它有[模式匹配](https://blogs.msdn.microsoft.com/dotnet/2016/08/24 /什么新功能于CSHARP-7-0 /)。 –

+0

@bigown你在寻找什么样的细节? –

回答

69

对于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考虑了比较的其他站点上的类型。太棒了!

我觉得== nullis 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没有区别。

+0

是的,这也是我对这个新功能的理解。我认为这将主要用于'switch'结构,这在c#中有一点限制。但是,从“零”这个角度来看,我认为它会以一种或另一种方式相同。 – Pikoh

+0

我想是的。我不知道对生成的CIL有什么影响,但我想这没有什么区别。 –

+9

@PatrickHofman [看起来像'is'调用'object.Equals(x,null)',而'=='编译为'ceq'。](http://tryroslyn.azurewebsites.net/#b:master/ f:%3Eilr/K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmAge06JgFkAjAApOBAFapSyGAA8AlDAC8APlkwwdCMCJEcASC49 + AJhHjJ0 + UtUylimFp04AvkA ==)但结果应该与您所说的相同。 – svick

相关问题