【问题标题】:What is a difference between "foo is null" and "foo == null"“foo is null”和“foo == null”有什么区别
【发布时间】:2017-06-17 17:45:52
【问题描述】:

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

【问题讨论】:

  • 你是在暗示只有在 C#7 中我们才能够找出引用是否为空?
  • @DavidArno 你说得对,我已经改进了这个问题,所以现在很清楚了。

标签: c# pattern-matching


【解决方案1】:

短版:对于表现良好的类型,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 == 时,你应该让它以一种合理的方式运行,这意味着你不应该说foo == nulltrue 对于非null foo。这样做的副作用是,在正常情况下,foo == nullfoo is null 将具有相同的值。

【讨论】:

    【解决方案2】:

    来自 MSDN 文档:

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

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

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

    【讨论】:

    • 该文档令人困惑。 == 可以重载,因此,对于用户定义的类型,它可以返回任何你想要的。
    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2010-09-06
    • 2010-12-12
    • 2011-02-14
    • 2015-03-08
    • 2018-07-01
    • 2017-06-23
    • 2011-04-16
    相关资源
    最近更新 更多