【问题标题】:Why doesn't == implementation call Equals for Guid? [closed]为什么 == 实现不为 Guid 调用 Equals? [关闭]
【发布时间】:2015-06-12 16:03:14
【问题描述】:

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

为什么== 运算符不对第一个参数调用 Equals 方法?像这样的:

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

【问题讨论】:

  • 投票结束是基于意见,我们无法理解框架设计者/开发者的想法。
  • 我的猜测是,在将 IEquatable 添加到框架之前,操作符实现就已经存在。添加后,他们选择复制操作员代码而不是重写它(也许是避免更改旧代码的策略?)但这纯粹是猜测。对于更积极的内联,也可能是一个非常小的优化考虑,但在这种情况下,我不会把它作为代码重复的特别有价值的理由。或者这只是一个错误,代码审查中没有人认为它已经糟糕到值得努力修复。
  • 我不认为链接的重复问题实际上回答了这个问题,如果Guid 它是一个值类型,因此它不能为空。重新打开问题..
  • 对于Guid的情况,由于实现是相同的,它可以调用Equals,但是这样做会进一步进入堆栈,并且增加不必要的开销。同样,如果出于某种原因Equals 的实现需要== 不同,则每个的基本实现已经分离,并且不需要进行重构。此外,正如@Habib 所说,这不一定与由于上下文而标记为重复的问题相同,我建议在标题中添加for Guid
  • @BradleyDotNET 关于 .NET Framework 的实现细节还有很多其他问题,有时他们会从了解很多的人甚至 MS 员工那里得到非常好的答案。你不应该仅仅因为无法回答就关闭它。

标签: c# .net equals-operator


【解决方案1】:

评论很有说服力:

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.Equals(Object) 之上实现Guid.operator ==Guid.Equals(Guid),那将是糟糕的,或者至少是次优的,因为最后一种方法需要毫无意义的分配,而它在常见情况下几乎不会引起注意,在分配可测量的紧密循环中的某些代码中肯定会发生Guid 比较。

现在,当然可以让operator == 使用Equals(Guid),反之亦然,但复制粘贴两次而不是一次确实不是任何额外的工作。

【讨论】:

  • 对于比较乏味的 cmets,例如“首先检查这是一个 GUID”,似乎这可能是由一个相当新的开发人员实现的,他可能不熟悉 DRY 主体 :)跨度>
  • @YuvalItzchakov 另外o == null 是多余的:如果o == null,那么!(o is Guid) 必然为真。
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 2013-02-17
  • 2020-01-04
  • 1970-01-01
相关资源
最近更新 更多