Overriding GetHashCode
Solution 1
When you override GetHashCode()
you also need to override Equals()
, operator==
and operator!=
. And be very careful to meet all the requirements for those methods.
The guidelines are here on MSDN. Most important quote:
It is not a good idea to override operator == in mutable types.
Solution 2
If you use resharper it can generate the GetHashCode(), Equals and operator method bodies for you.
Access this menu by pressing Alt+Insert.
http://www.jetbrains.com/resharper/webhelp/Code_Generation__Equality_Members.html
Solution 3
In my personal usage, I only override when overriding equals method too. Generally, I do this for objects I know that I might run a LINQ to Objects query on, or some other comparison operation.
I usually return, if say a LINQ to SQL entity or DTO object, the primary key value. Whatever you return, if you don't store the value locally, it may produce an unexpected result.
HTH.
Solution 4
I would normally override hashcode and equality checking methods for data classes (i.e. classes where the value semantics makes sense). Have a look at this question for a common implementation. If you do override hashcode override equals. Using a GUID is a pretty terrible idea because you want two objects which are different instances but have the same value to have the same hashcode and for equals to return true.
0x2D
Updated on November 25, 2020Comments
-
0x2D over 3 years
As you know, GetHashCode returns a semi-unique value that can be used to identify an object instance in a collection. As a good practice, it is recommended to override this method and implement your own.
My question is - do you override this method when working on custom objects? If so, what algorithm do you use to generate the unique ID?
I was thinking about generating a GUID and then getting integer data from that identificator.