我在.NET Framework的GUID类型的源代码中看到Equals和==
运算符的实现执行非常相似的代码。
为什么==
运算符不会在firts参数上调用Equals方法?像这样:
public static bool operator ==(Guid a, Guid b)
{
return a.Equals(b);
}
答案 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)
,反之亦然,但实际上并没有任何额外的工作要复制和粘贴两次而不是一次。