“x is null”和“x == null”有什么区别?

在C#7中我们可以使用

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"); } 

testing产生a 。 如果你把它与o == (object)1比较,你会正常写出什么东西,这确实有点不同。 is考虑在比较的其他网站上的types。 太棒了!

我认为== null== null is null不变的模式只是非常熟悉的“意外”,其中is运算符和equals运算符的语法产生相同的结果。


正如svick所说, is null调用System.Object::Equals(object, object) ==调用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 for ==

 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 ,那就没有什么区别了,因为这只会对实例产生影响 。