.net - null == null 吗?

标签 .net equality

我有一个类型为 Foo 的对象.
Foo 有一个 Id (int)

a) 下面的代码“好”吗?
b) 如果两者都为空,我应该返回什么?

// overload operator ==
public static bool operator ==(Foo a, Foo b)
{
    if (ReferenceEquals(x, y))
    {
        return true;
    }

    if (x == null && y == null)
    {
        return // ??? 
    }

    if (x == null || y == null)
    {
        return false; 
    }

    return x.Id == y.Id; // Ids are the same
}

public static bool Equals(Foo x, Foo y)
{
   return x == y;
}

编辑:
c) 应该等于 方法调用 == 运算符 , 或相反亦然?

最后一个问题
d) 有没有可能ReferenceEquals(x, y) == true x.Id != y.Id ?

最佳答案

是的
null只不过是值为零的内部指针。所以它正在比较两个具有零值的引用。

事实上object.ReferenceEquals(null, null)因为这个事实总是如此,所以你不需要第二次检查。

if (ReferenceEquals(x, y))
{
    return true;
}

if (x == null && y == null) // THIS CHECK IS REDUNDANT!!!
{
    return true;
}

最后一点,除非在 上,否则 == 和 Equals 的处理方式相同。盒装值类型 :
        object s1 = 2;
        object s2 =  1+1;

        Console.WriteLine(s1 == s2);
        Console.WriteLine(s1.Equals(s2));

这会产生 falsetrue .

d点:它是同一个对象,同一个内存空间——如果它们指向对象上的一个字段。

关于.net - null == null 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4077418/

相关文章:

java - !(a==b) 和 a!=b 的区别

.net - 使用来自 .NET 的 OpenSSL 的 PKCS5_PBKDF2_HMAC

c# - 如何将运行时已知的类型转换为给定类型的列表?

C++ 快速相等函数

r - R 中的近似等于

functional-programming - 方案中的 eq?、eqv?、equal? 和 = 有什么区别?

c# - MS覆盖Equals()准则无法达到自己的标准。改为使用最佳做法?

c# - Windows 工作流 StateActivity 切换性能

c# - 为什么即使没有更新,ExecuteNonQuery 也会返回 1?

c# - XML 字符串数组反序列化