c# - 在 IEquatable<T> 实现中需要进行引用检查

标签 c# equals iequatable

我有一个实现 IEquatable<T> 的类.是否有必要在 Equals() 中进行引用检查还是在框架中处理?

class Foo : IEquatable<Foo>
{
    int value;
    Bar system;

    bool Equals(Foo other)
    {
        return this == other || 
        ( value == other.value && system.Equals(other.system) );
    }
}

在上面的例子中是this==other声明是多余的还是必要的?

更新1

我知道我需要按如下方式更正代码:

    bool Equals(Foo other)
    {
        if( other==null ) { return false; }
        if( object.ReferenceEquals(this, other) ) { return true; } //avoid recursion
        return value == other.value && system.Equals(other.system);
    }

感谢您的回复。

最佳答案

这通常是一种优化 - 这将是一个奇怪的 Equals 实现,没有它就会失败。因此,我认为它是必要的——但它也没有“在框架中得到处理”。 I 是实现成本低廉的优化,因此通常值得包括在内。

请注意,如果您重载==,那么您可能应该使用object.ReferenceEquals 来执行这些比较。

关于c# - 在 IEquatable<T> 实现中需要进行引用检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4682388/

相关文章:

C# - 以逗号分隔的字符串中的分隔姓氏和名字

C# 获取完整文件路径

.net - 如何比较两个日期时间

java - hashCode() 和 equals() 与 Class<T>

c# - 编译器选择错误的重载调用 IEquatable<T>.Equals

c# - 最小起订量 - 如何使用 SetupGet/SetupSet 手动创建支持属性?

c# - 向 IQueryable 追加附加查询部分

java - 覆盖 Arrays.BinarySearch 的 equals 方法

c# - 通过提供示例对象实例在 List<T> 中查找项目

c# - 使用结构作为字典的键和奇怪的事情正在发生