Weiter zu den anderen Antworten hier ist ein sehr guter Grund zu implementieren IEquatable<T>
(und offensichtlich überschreiben Equals(object)
auch) für Werttypen. Sehen Sie sich einfach den Standardcode ValueType.Equals(object)
an, der sonst aufgerufen wird. Es ist ein absoluter Performance-Killer, der Boxing, Typevaluierung und schließlich Reflexion einleitet, wenn es sich bei den Feldern um Referenztypen handelt.
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
RuntimeType type = (RuntimeType) base.GetType();
RuntimeType type2 = (RuntimeType) obj.GetType();
if (type2 != type)
{
return false;
}
object a = this;
if (CanCompareBits(this))
{
return FastEqualsCheck(a, obj);
}
FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
for (int i = 0; i < fields.Length; i++)
{
object obj3 = ((RtFieldInfo) fields[i]).UnsafeGetValue(a);
object obj4 = ((RtFieldInfo) fields[i]).UnsafeGetValue(obj);
if (obj3 == null)
{
if (obj4 != null)
{
return false;
}
}
else if (!obj3.Equals(obj4))
{
return false;
}
}
return true;
}
In bestimmten Szenarien (wie den Werttyp als Schlüssel in einem Wörterbuch verwendet wird) kann die Leistung in einem Foul Swoop ermorden.
Es sparen Sie Boxing/Unboxing Handhabung. Hier gute und einfache Erklärung dafür: http: //www.codeproject.com/Articles/20592/Implementing-IEquatable-Properly – Jviaches