One if the ways to implement GetHashCode - where it's required to do so - is outlined by Jon Skeet here. Repeating his code:
public override int GetHashCode()
{
unchecked // Overflow is fine, just wrap
{
int hash = 17;
// Suitable nullity checks etc, of course :)
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
}
Rolling this code by hand can be error-prone and bugs can be subtle/hard to spot (did you swap +
and *
by mistake?), it can be hard to remember the combination rules for different types, and I don't like expending mental effort on writing/reviewing the same thing over and over again for different fields and classes. It can also obfuscate one of the most important details (did I remember to include all the fields?) in repetitive noise.
Is there a concise way to combine field hashcodes using the .net library?. Obviously I could write my own, but if there's something idiomatic/built-in I'd prefer that.
As an example, in Java (using JDK7) I can achieve the above using:
@Override
public int hashCode()
{
return Objects.hash(field1, field2, field3);
}
This really helps to eliminate bugs and focus in the important details.
Motivation: I came across a C# class which requires an overridden GetHashCode()
, but the way it combined the hashcodes of its various constituents had some severe bugs. A library function for combining the hashcodes would be useful for avoiding such bugs.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…