“foo is null”和“foo == null”之间的区别是什么?

之间有什么区别: foo is nullfoo == null

简短版本:对于表现良好的类型, foo is nullfoo == null之间没有区别。

长版:

当你写foo == null并且存在适当的operator ==重载时,那就是所谓的。 否则,引用相等用于引用类型,值相等用于值类型。

当您为引用类型编写foo is null ,编译就好像您编写了object.Equals(null, foo) (注意切换顺序,它会有所不同)。 实际上,这将执行foonull之间的引用相等性比较。 对于值类型, 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 foofoo == nulltrue 。 作为这样的副作用,在正常情况下, foo == nullfoo is null将具有相同的值。

来自MSDN文档:

运算符检查对象是否与给定类型兼容,或者(从C#7开始)针对模式测试表达式。 is关键字在运行时评估类型兼容性。 它确定是否可以将对象实例或表达式的结果转换为指定的类型。

== is对于预定义的值类型,如果操作数的值相等,则相等运算符(==)返回true,否则返回false。 对于除string之外的引用类型,如果其两个操作数引用同一对象,则==返回true。 对于字符串类型,==比较字符串的值。

摘要:不,这个例子中没有。 如果你想检查type通常是使用。 在这种情况下,它为null。 ==如果你想检查价值。 在这种情况下也为null,因此两者都将评估为true。