null == null吗?

ser*_*hio 5 .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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:
c)Equals方法应该调用==运算符,还是反之?

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

Row*_*haw 14

这实际上是无法访问的代码,如ReferenceEquals()记录返回true如果两个操作数都为空.

编辑:专门回答你的观点(d):当ReferenceEquals返回时true,两个引用必须相同; 所以他们指向同一个对象.因此,除非您在属性访问器中执行不可预测的操作,否则将从同一对象读取Id的值,并且预期它们将是相同的.(这里的故事的道德是,属性应该以可重复的方式表现,没有其他副作用,如果没有已经设置可能分配ID)

完全有可能你有两个具有相同Id但不同引用的对象.例如:

Foo a = new Foo();
Foo b = new Foo();
Run Code Online (Sandbox Code Playgroud)

ReferenceEquals()在比较ab(因为它们是不同的实例)时会给出错误,但除非该构造函数做了类似分配的事情,否则Id我希望它们共享该Id并且您的等式检查将通过.


Ali*_*tad 9

null只是内部指针,零值.所以它比较两个值为零的引用.

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

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

if (x == null && y == null) // THIS CHECK IS REDUNDANT!!!
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

在最后一点,==和Equals处理相同,除非在盒装值类型上:

        object s1 = 2;
        object s2 =  1+1;

        Console.WriteLine(s1 == s2);
        Console.WriteLine(s1.Equals(s2));
Run Code Online (Sandbox Code Playgroud)

这产生falsetrue.

d点:NO是相同的对象,相同的内存空间-如果它们指向的对象上的字段.