“foo is null”和“foo == null”有什么区别吗?
“foo is null”和“foo == null”有什么区别吗?
简短版:对于表现良好的类型,foo is null
和foo == null
没有区别。
详细版:
当你写foo == null
且存在适当的operator ==
重载时,则会调用该方法。否则,对于引用类型使用引用相等性(Rereference equality),对于值类型使用值相等性(Value equality)。
当你为引用类型写foo is null
时,这会被编译为object.Equals(null, foo)
(注意顺序已更改,这会产生影响)。实际上,这执行了foo
和null
之间的引用相等比较。对于值类型,foo is null
无法编译。
这意味着,如果你编写一个带有operator ==
的类,该类表示某个foo
实例等于null
,那么foo == null
将与foo is null
产生不同的结果。
以下是一个示例:
using System;
public class Foo
{
public static void Main()
{
var foo = new Foo();
Console.WriteLine(foo == null);
Console.WriteLine(foo is null);
}
public static bool operator ==(Foo foo1, Foo foo2) => true;
// operator != has to exist to appease the compiler
public static bool operator !=(Foo foo1, Foo foo2) => false;
}
这段代码会输出:True
False
当你重载operator ==
时,你应该让它表现出合理的行为,在其中一些情况下,这意味着你不应该说对于非null
的foo
,foo == null
是true
。由此产生的副作用是,在正常情况下,foo == null
和foo is null
将具有相同的值。
==
可以被重载,因此对于用户定义的类型,它可以返回任何你想要的东西。 - svick