I find my self overriding Equals()
and GetHashCode()
frequently to implement the semantic that business objects with identical property values are
MSDN actually doesn't say "don't overload Equals et al for mutable types". It used to say that, but now it says:
When you define a class or struct, you decide whether it makes sense to create a custom definition of value equality (or equivalence) for the type. Typically, you implement value equality when objects of the type are expected to be added to a collection of some sort, or when their primary purpose is to store a set of fields or properties.
http://msdn.microsoft.com/en-us/library/dd183755.aspx
Still, there are complexities surrounding stability of the hash code while an object participates in a hashed collection (Dictionary<T,U>
, HashSet<T>
, etc.).
I decided to opt for the best of both worlds, as outlined here:
https://stackoverflow.com/a/9752155/141172
I find my self overriding Equals() and GetHashCode() frequently
Is ^ adequate given that the contributing component values are well-distributed?
int
properties. Shifting with some (small) prime numbers is advised. Perhaps I'm confused here, but shouldn't the on null
check return a 1 instead of a 0 in the GetHashCode
override?
So
MyStringProp == null ? 0 : MyStringProp.GetHashValue()
should be
MyStringProp == null ? 1 : MyStringProp.GetHashValue()