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