2009-07-01 4 views
2

Eine Klasse hat eine ID-Eigenschaft und diese Eigenschaft erhält Wert aus einer Primärschlüsselspalte einer SQL-Tabelle.GetHashCode() basiert auf einem Primärschlüssel - ist es sicher?

Ist es eine gute Praxis, wenn ich

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

in meine Klasse schreiben? (Equals overrided bereits auf die gleiche Weise.)

Antwort

5

Warum möchten Sie den Typ besonders in den Hashcode einbeziehen? Ich kann sehen, wie das nützlich sein könnte, wenn Sie viele verschiedenen Arten von Objekten mit der gleichen ID in der gleichen Karte haben, aber normalerweise würde ich nur

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

Hinweis verwenden, die Ideen der Gleichheit innerhalb Erbschaft heikel worden Hierarchien - ein weiterer Grund, die Komposition der Vererbung vorzuziehen. Müssen Sie sich darüber wirklich Sorgen machen? Wenn Sie Ihre Klasse abdichten kann, wird es der Gleichheitstest einfacher machen, wie Sie nur schreiben müssen: (. Sie können auch eine stark typisierte Methode haben wollen Equals und IEquatable implementieren)

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

+0

Dank Für euch beide +1 für die versiegelte Idee. – boj

2

Warum kannst du nicht einfach tun

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

Ich bin nicht sicher, ob das, was Sie tun, gute Praxis ist, weil ich nicht vertraut bin mit, wie die Hash-Code ist einer Typinstanz zugeordnet. Und der Zweck des Hashcodes besteht darin, eine konsistente Darstellung des Objekts in der Int32-Form zu haben.

Verwandte Themen