我想让类 X
的每个实例都有一个唯一的 ID。
我正在使用递增的数字来执行此操作:
class X {
private int id;
private static int instanceCounter = 0;
public X() {
id = Interlocked.Increment(ref instanceCounter);
}
//...
}
这些对象也用作字典中的键,所以我想我可以从 GetHashCode()
返回 id
。
public override int GetHashCode() {
return id;
}
我知道 Eric Lippert's post ,但它总是谈论从存储在对象中的多个数据计算散列。
在我的例子中,唯一的“唯一”数据是 id
。
那么问题是:
这种方法有什么我没有考虑过的吗?
最佳答案
如果您希望每个对象都不同(因此不等于任何其他对象),那么根本不要覆盖 Equals
和 GetHashCode
。默认设置是提供一个“可能唯一”的哈希码,这是缩小选择范围所需的全部 - Equals
将使用引用身份,这正是您想要的。不需要单独的 id
字段,只是为了相等。
如果您确实出于其他原因需要 id
字段,您当然可以从 GetHashCode
返回它 - 我建议将其设为只读字段以表明您的意图。
请注意,哈希码无论如何都不应该用作明确肯定的相等性检查 - 它们仅用于排除绝对不彼此相等的实例.
关于c# - 使用增量数字作为 GetHashCode 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20350702/