2009-07-01 59 views
2

一个类有一个ID属性,此属性从SQL表的主键列中获取值。基于主键的GetHashCode() - 安全吗?

它是一个很好的做法,如果我写

public override int GetHashCode() 
{ 
    return this.ID + GetType().GetHashCode(); 
} 

到我的课? (的Equals已经overrided以同样的方式。)

回答

5

你为什么特别想在hashcode中包含这个类型?我可以看到,如果你有很多不同类型的在同一地图同一ID对象的可能是有用的,但通常我只用

public override int GetHashCode() 
{ 
    return ID; // If ID is an int 
    // return ID.GetHashCode(); // otherwise 
} 

注意继承范围内的平等观念成为棘手层次结构 - 偏好合成而非继承的另一个原因。你真的需要担心这个吗?如果你能封住你的类,它将使平等的测试更容易,因为你只需要编写:(你可能希望有一个强类型的equals方法和实施IEquatable)

public override bool Equals(object obj) 
{ 
    MyType other = obj as other; 
    return other != null && other.ID == ID; 
} 

+0

谢谢对于你们两个人来说,密封的想法+1。 – boj 2009-07-01 16:59:18

2

为什么你不能只是做

public override int GetHashCode() { 
    return this.ID.GetHashCode(); 
} 

我不知道你在做什么是好的做法,因为我不熟悉如何哈希码被分配给一个类型实例。哈希码的目的是以Int32形式存在对象的一致性表示。