是以下代码行代码的结果:
if (Equals(comp.Id, Guid.Empty)) return;
总是与下一行代码相同?
if(comp.Id == Guid.Empty) return;
答案 0 :(得分:4)
我不认为你应该假设,如果你的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.Id
是Guid
并且您没有做任何异常,例如使用两个参数自定义重载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.ID
是Guid
,Equals
是Guid.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,而后者将(我认为)抛出一个空引用异常。