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?
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 ofGetHashCodeandEquals. But for value types this required boxing.IEquatable<T>lets a structure implement a strongly typedEqualsmethod, 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 fromSystem.Objectwhich can make a difference if it’s called frequently.As noted on Jared Parson’s blog though, you must still implement the standard
Object.EqualsandObject.GetHashcodeoverrides.