代码之家  ›  专栏  ›  技术社区  ›  serhio

null==null吗?

  •  5
  • serhio  · 技术社区  · 14 年前

    Foo .
    Id (内景)

    a) 下面的代码是“好”吗?

    // 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

    4 回复  |  直到 14 年前
        1
  •  9
  •   Aliostad    13 年前

    是的

    null

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

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

    装箱值类型

            object s1 = 2;
            object s2 =  1+1;
    
            Console.WriteLine(s1 == s2);
            Console.WriteLine(s1.Equals(s2));
    

    这就产生了 false true .

    它是同一个对象,同一个内存空间-如果它们指向对象上的某个字段。

        2
  •  15
  •   Rowland Shaw    14 年前

    ReferenceEquals() documented 返回 true 如果两个操作数都为空。

    编辑: 具体回答你的观点(d):当 ReferenceEquals 真的 ,则两个引用必须相同;因此它们指向同一对象。所以,除非您在属性访问器中执行了一些不可预知的操作,否则Id的值将从同一对象中读取,并且 预期

    你完全有可能有两个相同的物体 Id ,但参考文献不同。例如:

    Foo a = new Foo();
    Foo b = new Foo();
    

    比较时会给出错误的结果 a b (因为它们是不同的 实例 身份证件 ,我希望他们能分享这个身份证,你的平等检查就会通过。

        3
  •  4
  •   Armen Tsirunyan    14 年前

    对,

    null == null
    

    我会这样重构你的代码

    if(x!=null && y!=null)
       return x.id == y.id;
    return x == null && y == null;
    
        4
  •  3
  •   Ondrej Tucny    14 年前

    ReferenceEquals 当两个参数都为空时,已处理该情况 MSDN 声明“如果objA与objB是同一个实例,或者两者都为空,则为true;否则为false。”重新获取其返回值。