有什么区别" foo是null"和" foo == null"

时间:2017-06-17 17:45:53

标签: c# pattern-matching

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

2 个答案:

答案 0 :(得分:12)

简短版本:对于行为良好的类型,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不同的结果1}}。

显示此内容的示例:

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 ==时,你应该让它以合理的方式行事,除其他外,这意味着你不应该说非foo == nulltruenull 1}} foo。这样做的副作用是,在正常情况下,foo == nullfoo is null将具有相同的值。

答案 1 :(得分:5)

来自MSDN文档:

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

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

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