IEquatable Interface

Overview

  • Enables instances of a class to be compared for equality.
    • e.g.: if (a = = b)

Good practice

Examples

Comparing Custom Class

class MyNumber : IEquatable<MyNumber>
{
    private int _x;
 
    public int X
    {
        get { return this._x; }
        set { this._x = value; }
    }
 
    public MyNumber(int x)
    {
        this._x = x;
    }
 
    public override int GetHashCode()
    {
        return this._x.GetHashCode();
    }
 
    public override bool Equals(object obj)
    {
        if (obj == null) return base.Equals(obj);
 
        if (!(obj is MyNumber))
        {
            throw new InvalidCastException("The 'obj' argument is not a MyNumber object.");
        }
        else
        {
            return Equals(obj as MyNumber);
        }
    }
 
    #region IEquatable<MyNumber> Members
    public bool Equals(MyNumber other)
    {
        if (other == null)
        {
            return false;
        }
        else
        {
            return (other.X == this.X);
        }
    }
    #endregion
 
    public static bool operator ==(MyNumber a, MyNumber b)
    {
        if (object.ReferenceEquals(a, b)) return true;
        if (object.ReferenceEquals(a, null)) return false;
        if (object.ReferenceEquals(b, null)) return false;
 
        return a.Equals(b);
    }
 
    public static bool operator !=(MyNumber a, MyNumber b)
    {
        return !(a == b);
    }
}
MyNumber a = new MyNumber(10);
MyNumber b = new MyNumber(10);
 
Console.WriteLine(a.Equals(b)); // True
Console.WriteLine(a == b); // True