问题描述
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 (将#修改为@)