Search code examples
c#.netequalsequalityiequatable

What's the difference between IEquatable and just overriding Object.Equals()?


I want my Food class to be able to test whenever it is equal to another instance of Food. I will later use it against a List, and I want to use its List.Contains() method. Should I implement IEquatable<Food> or just override Object.Equals()? From MSDN:

This method determines equality by using the default equality comparer, as defined by the object's implementation of the IEquatable.Equals method for T (the type of values in the list).

So my next question is: which functions/classes of the .NET framework make use of Object.Equals()? Should I use it in the first place?


Solution

  • The main reason is performance. When generics were introduced in .NET 2.0 they were able to add a bunch of neat classes such as List<T>, Dictionary<K,V>, HashSet<T>, etc. These structures make heavy use of GetHashCode and Equals. But for value types this required boxing. IEquatable<T> lets a structure implement a strongly typed Equals method, so no boxing is required. Thus much better performance when using value types with generic collections.

    Reference types don't benefit as much, but the IEquatable<T> implementation does let you avoid a cast from System.Object which can make a difference if it's called frequently.

    As noted on Jared Parson's blog though, you must still implement the standard Object.Equals and Object.GetHashcode overrides.