Mire való az IEquatable?

Ha value type-ot írsz, és azon gyors, boxolás nélküli egyenlőségvizsgálatot akarsz csinálni, akkor implementáld ezt az interfészt.
Másképp az object.Equals fut le, ami miatt boxolni kell. Hasonló a helyzet az IComparable-lel is.
Érdemes megnézni debuggerben, mikor-mi fut le, ha implementáljuk az interfészt, és ha kikommentezzük az implementációt:


using System;
using System.Collections.Generic;

internal struct MyStruct : IEquatable<MyStruct>
{
    public MyStruct(int a)
    {
        this.a = a;
    }

    private readonly int a;

    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }
    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    #region IEquatable<MyStruct> Members

    public bool Equals(MyStruct other)
    {
        return other.a == a;
    }

    #endregion
}
class Program
{
    static void Main()
    {
        List<MyStruct> l = new List<MyStruct> {new MyStruct(33)};
        l.Contains(new MyStruct(22));
    }
}

Leave a Reply