我想让一个具有唯一ID的班级X
的每个实例
我是用递增的数字来做的:
class X {
private int id;
private static int instanceCounter = 0;
public X() {
id = Interlocked.Increment(ref instanceCounter);
}
//...
}
这些对象也被用作词典中的键,所以我想我可以从id
返回GetHashCode()
。
public override int GetHashCode() {
return id;
}
我知道Eric Lippert's post,但它总是讨论从存储在对象中的多个数据计算哈希值。
就我而言,唯一的“唯一”数据是id
。
所以问题是:
我有没有想过这种方法?
答案 0 :(得分:4)
如果您希望每个对象都是不同的(因此不等于任何其他对象),那么根本不要覆盖Equals
和GetHashCode
。默认情况下是提供“可能唯一”的哈希代码,这就是缩小选择范围所需的全部内容 - Equals
将使用引用标识,这就是您想要的。没有必要单独的id
字段,只是为了平等。
如果您 因其他原因需要id
字段,您当然可以从GetHashCode
返回 - 我建议将其设为只读字段,以明确您的意图虽然。
请注意,哈希代码永远不应该用作明确的正等式检查 - 它们仅用于排除明确不彼此相等的实例
答案 1 :(得分:2)
如果您只关心Equals()正常工作,可以覆盖GetHashCode,如
public override int GetHashCode() {
return 0;
}
含义每次都必须调用Equals();这在逻辑上是很好的,但可能导致性能方面的问题(这将有效地使这个类的任何散列表具有检索复杂度O(n)而不是O(1));但是对于小清单(数十项),应该没问题。