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

Mac*_*sCK 5 c# pattern-matching

有没有什么区别: foo is nullfoo == null

svi*_*ick 12

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

长版:

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

当您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;
}
Run Code Online (Sandbox Code Playgroud)

此代码输出:

True
False
Run Code Online (Sandbox Code Playgroud)

当你超载operator ==,你应该让以合理的方式,其中,除其他外,意味着你不应该说表现foo == nulltrue对非null foo.作为一个副作用,一般情况下,foo == null并且foo is null将具有相同的价值.


123*_*9 0 5

来自MSDN文档:

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

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

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

  • 该文档令人困惑.`==`可以重载,因此,对于用户定义的类型,它可以返回你想要的任何内容. (2认同)