如何在没有任何数字作为字段的情况下重写GetHashCode()



所有显示如何覆盖Equals(object)GetHashCode()的资源都使用数字字段来实现GetHashCode()方法:

实现Equals方法
What';Equals和GetHashCode的最佳策略是什么?
为什么在重写Equals方法时重写GetHashCode很重要?

然而,在我的课堂上,我没有任何数字字段。它是树中的一个节点,引用其父节点、子节点和接口作为数据:

public class Node
{
private IInterface myInterface;
private Node parent;
private List<Node> children = new List<Node>();
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var node = (Node)obj;
return myInterface == node.myInterface;
}
public override int GetHashCode()
{
???
}
}

我应该用什么设置哈希代码?

根据Equals实现,两个Nodes实例相等,当且仅当它们的myInterface相等:

public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var node = (Node)obj;
// instances are equal if and only if myInterface's are equal
return myInterface == node.myInterface;
}

这就是为什么myInterfaceGetHashCode:的唯一来源

public override int GetHashCode()
{
return null == myInterface ? 0 : myInterface.GetHashCode();
}

p.S.(编辑,感谢Kris Vandermotten)通常,在比较可能耗时/资源的myInterfaceS:之前,检查Equals实现中的ReferenceEquals是一种很好的做法

public override bool Equals(object obj) {
// Easy tests: 
// 1. If "this" and "obj" are in fact just the same reference?
// 2. Since `Node` (or Equals) is not sealed, the safiest is to check types 
if (object.ReferenceEquals(this, obj))
return true;
else if (null == obj || other.GetType() != GetType()) 
return false;
// Potentially time/resource cosuming (we don't know IInterface implementation)
return ((Node) obj).myInterface == myInterface;
}

相关内容

  • 没有找到相关文章

最新更新