为什么不= =实现调用Guid的等于?

时间:2015-06-12 16:03:15

标签: c# .net equals-operator

我在.NET Framework的GUID类型的源代码中看到Equals==运算符的实现执行非常相似的代码。

为什么==运算符不会在firts参数上调用Equals方法?像这样:

public static bool operator ==(Guid a, Guid b)
{ 
    return a.Equals(b);  
}

1 个答案:

答案 0 :(得分:5)

评论很有说服力:

public static bool operator ==(Guid a, Guid b)
{
    // Now compare each of the elements

这本身并没有意义。在文件的其他地方寻找该评论:

public bool Equals(Guid g)
{
    // Now compare each of the elements

但也

// Returns true if and only if the guid represented
//  by o is the same as this instance.
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

评论仅在最后一种方法中有意义。这是一个非常强烈的迹象,表明Guid.Equals(Object)实施是第一次。

如果Guid.operator ==Guid.Equals(Guid)Guid.Equals(Object)之上实施,那将是不好的,或者至少是次优的,因为最后一个方法需要毫无意义的分配,虽然在常见情况下几乎不会引起注意,但在紧密循环中某些代码中会发生Guid次比较,其中分配是可测量的。

现在,肯定可以让operator ==使用Equals(Guid),反之亦然,但实际上并没有任何额外的工作要复制和粘贴两次而不是一次。