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
É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));
}
}