是Equals(Object,Guid.Empty)与Object相同== Guid.Empty

时间:2014-08-14 22:42:38

标签: c#

是以下代码行代码的结果:

if (Equals(comp.Id, Guid.Empty)) return;

总是与下一行代码相同?

if(comp.Id == Guid.Empty) return;

3 个答案:

答案 0 :(得分:4)

  1. 两者的默认实现检查引用类型中的引用,并检查值类型的实际内容。
  2. 不一定,==和.Equals都可以重载。
  3. Guid和string都覆盖==和.Equals,并且实现是相同的,检查两个Guids之间的相等性是基于值的,并且两个字符串之间的比较也将是基于值的。但是,无论您如何操作,比较字符串和Guids都将始终返回false。您需要将Guid.ToString()的结果与字符串值进行比较,否则您需要将字符串转换为Guid。
  4. 取自 http://social.msdn.microsoft.com/Forums/en-US/a505b091-9166-4c74-91dd-a8e9eb6ad001/-and-equals-comparision-for-systemguid-and-string?forum=csharplanguage

    我不认为你应该假设,如果你的Equals方法看起来像这样

    Equals(guid id1, guid id2)
    {
       return id1 == id2 ;
    }
    

    我希望这有意义.....等于需要上下文

    如果等于这样......

    equsl(guid id1, guid id2)
    {
       string firstG = id1.toString();
       string secondG = id2.toString();
       return firstG == secondG;
    }
    

    在这里你可以看到它将是一个字符串比较而不是guid比较...它可能会出现不同......

答案 1 :(得分:3)

这个答案将假设comp.IdGuid并且您没有做任何异常,例如使用两个参数自定义重载Equals()或使用自定义{ {1}}类型与Guid不同。

您的第一行将致电the static method object.Equals(object objA, object objB)。该方法的作用是检查System.Guid(此处不相关,因为null永远不能Guid),然后调用null。自objA.Equals(objB) overrides object.Equals(object)以来,这就是要调用的方法。并且该方法比较两个Guid值的相等性(假设参数确实是Guid,它就在这里)。

您的第二行将致电the overloaded operator == for Guid。这再次比较了两个Guid的相等性。

这意味着这些方法将具有相同的结果。主要区别在于第一行与Guid s一起使用,这意味着您的object都必须装箱。这样做会对性能产生负面影响。所以在这种情况下,我建议使用Guid

答案 2 :(得分:1)

根据来源here,以下是这两个函数的源代码(假设comp.IDGuidEqualsGuid.Equals,两者都不是当然已经超载了)。看起来两者的功能完全相同。

    public bool Equals(Guid g)
    {
        // Now compare each of the elements
        if(g._a != _a)
            return false;
        if(g._b != _b)
            return false;
        if(g._c != _c)
            return false;
        if (g._d != _d)
            return false;
        if (g._e != _e)
            return false;
        if (g._f != _f)
            return false;
        if (g._g != _g)
            return false;
        if (g._h != _h)
            return false;
        if (g._i != _i)
            return false;
        if (g._j != _j)
            return false;
        if (g._k != _k)
            return false;

        return true;
    }

 public static bool operator ==(Guid a, Guid b)
    {
        // Now compare each of the elements
        if(a._a != b._a)
            return false;
        if(a._b != b._b)
            return false;
        if(a._c != b._c)
            return false;
        if(a._d != b._d)
            return false;
        if(a._e != b._e)
            return false;
        if(a._f != b._f)
            return false;
        if(a._g != b._g)
            return false;
        if(a._h != b._h)
            return false;
        if(a._i != b._i)
            return false;
        if(a._j != b._j)
            return false;
        if(a._k != b._k)
            return false;

        return true;
    }

编辑:如果您使用的是由svick链接的object.Equals方法,则最后一行说明如下:

如果两个对象不表示相同的对象引用且都不为null,则调用objA.Equals(objB)并返回结果。这意味着如果objA重写了Object.Equals(Object)方法,则会调用此覆盖。

Guid确实有Equals(object)的重载,所以让我们来看看来源:

public override bool Equals(Object o)
    {
        Guid g;
        // Check that o is a Guid first
        if(o == null || !(o is Guid))
            return false;
        else g = (Guid) o;

        // Now compare each of the elements
        if(g._a != _a)
            return false;
        if(g._b != _b)
            return false;
        if(g._c != _c)
            return false;
        if (g._d != _d)
            return false;
        if (g._e != _e)
            return false;
        if (g._f != _f)
            return false;
        if (g._g != _g)
            return false;
        if (g._h != _h)
            return false;
        if (g._i != _i)
            return false;
        if (g._j != _j)
            return false;
        if (g._k != _k)
            return false;

        return true;
    }

正如我们所看到的,这个函数检查传递的对象实际上是Guid(这对Guid的{​​{1}}重载不起作用,所以它是一个没有实际意义的点,然后和==做同样的事情(事实上,似乎复制了实现,因为即使评论是相同的,也不适合{{1} })。

因此,最终答案似乎是假设两个对象都是Equals(Guid)Equals(Guid)返回与Guids不同的结果的唯一实例是两个对象都为空时:前者将返回true,而后者将(我认为)抛出一个空引用异常。