Visual Studio 为 Equals 和 GetHashCode 提供两个版本的代码生成

问题描述

Visual Studio 提供两种方式为 Equals() 和 GetHashCode() 生成代码

public class Identifier
{
    public string firstName;
    public string lastName;
    internal Identifier(string firstName,string lastName) { this.firstName = firstName; this.lastName = lastName; }
    public override bool Equals(object obj)
    {
        return obj is Identifier identifier &&
               firstName == identifier.firstName &&
               lastName == identifier.lastName;
    }
    public override int GetHashCode()
    {
        return HashCode.Combine(firstName,lastName);
    }
    public override string ToString() { return $"{this.firstName} {this.lastName}"; }
}

另一种方式...

public class Identifier : IEquatable<Identifier>
{
    public string firstName;
    public string lastName;
    internal Identifier(string firstName,string lastName) { this.firstName = firstName; this.lastName = lastName; }
    public override bool Equals(object obj)
    {
        return Equals(obj as Identifier);
    }
    public bool Equals(Identifier other)
    {
        return other != null &&
               firstName == other.firstName &&
               lastName == other.lastName;
    }
    public override int GetHashCode()
    {
        return HashCode.Combine(firstName,lastName);
    }
    public override string ToString() { return $"{this.firstName} {this.lastName}"; }
}

指导选择的实际差异是什么?第一种情况是否仅仅因为有些人喜欢不那么冗长的解决方案而存在?

编辑我只是想添加一些关于减少混乱的想法。如果代码有足够的测试,测试的成功可以用来“证明”GetHashCode 不是必需的(例如因为类型没有用作字典键),在这种情况下可以省略 GetHashCode 并减少混乱。 IEquatable<T> 不需要 GetHashCode。请注意,在上述两种情况下,override bool Equals(object obj) 都是生成代码,但如果您知道自己在做什么,因为它很混乱,或者您可能想要 override bool Equals(object obj) { Debug.Assert(false); return false; }强制“早期”失败并让消费者使用 bool Equals(T obj) 其中 T 是适当的类型。不幸的是,如果您 override bool Equals(object obj) 那么您会收到关于缺少 GetHashCode 的警告,并且使用元数据来隐藏警告很烦人,会造成混乱或繁忙的工作设置编译器选项。

编辑我选择了 override boo Equals(object obj)override int GetHashCode,没有实现 IEquatable<T> 因为 2 个方法比 3 个方法更简洁,而且不用担心字典查找错误,我不需要 : IEquatable<T>bool Equals(T obj),缺少字典和列表不会引发投诉。此解决方案涉及强制转换,但过早优化很糟糕。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...