“foo is null”和“foo == null”的区别是什么?(这是一个关于IT技术的提问标题)

9

“foo is null”和“foo == null”有什么区别吗?


你是在暗示只有在C#7中我们才获得了查找引用是否为空的能力吗? - 15ee8f99-57ff-4f92-890c-b56153
@DavidArno 你说得对,我已经改进了问题,现在很清楚了。 - MaciejLisCK
这个回答解决了你的问题吗?“x is null”和“x == null”的区别是什么? - undefined
2个回答

15

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

详细版:

当你写foo == null且存在适当的operator ==重载时,则会调用该方法。否则,对于引用类型使用引用相等性(Rereference equality),对于值类型使用值相等性(Value equality)。

当你为引用类型写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 ==时,你应该让它表现出合理的行为,在其中一些情况下,这意味着你不应该说对于非nullfoofoo == nulltrue。由此产生的副作用是,在正常情况下,foo == nullfoo is null将具有相同的值。


6
从MSDN文档中可以得知: is运算符用于检查对象是否与给定类型兼容,或者(从C# 7开始)根据模式测试表达式。is关键字在运行时评估类型兼容性。它确定对象实例或表达式的结果是否可以转换为指定的类型。 ==运算符对于预定义值类型,如果其操作数的值相等,则等于运算符(==)返回true,否则返回false。对于除字符串之外的引用类型,如果其两个操作数引用同一对象,则==返回true。对于字符串类型,==比较字符串的值。
总结:在这个例子中没有使用is运算符。如果你想要检查类型,通常会使用is。在这种情况下,它是null。如果你想要检查值,使用==。在这种情况下也是null,所以两者都将评估为true。

2
那份文档很令人困惑。== 可以被重载,因此对于用户定义的类型,它可以返回任何你想要的东西。 - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接