使用增量数作为 GetHashCode 返回值

joe*_*joe 2 c# hash unique

我想让类的每个实例都X具有唯一的 ID。
我正在使用递增的数字执行此操作:

class X {
    private int id;
    private static int instanceCounter = 0;

    public X() {
        id = Interlocked.Increment(ref instanceCounter);
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

这些对象也用作字典中的键,所以我想我可以idGetHashCode().

    public override int GetHashCode() {
        return id;
    }
Run Code Online (Sandbox Code Playgroud)

我知道Eric Lippert 的帖子,但它总是谈论从存储在对象中的多个数据计算散列。
就我而言,唯一的“唯一”数据是id.

所以问题是:
用这种方法有什么我没有考虑过的吗?

Jon*_*eet 5

如果您希望每个对象都不同(因此不等于任何其他对象),那么根本不要覆盖EqualsGetHashCode。默认值是给出一个“可能是唯一的”哈希码,这是您缩小选择范围所需的全部 - 并且Equals将使用参考标识,这正是您想要的。没有必要有一个单独的id领域,只是为了平等。

如果您出于其他原因确实需要该id字段,您当然可以将其返回GetHashCode- 我建议将其设为只读字段,以明确您的意图。

请注意,无论如何,哈希码都不应该用作明确的正相等检查 - 它们仅用于排除绝对相等的实例。