Además de las otras respuestas, esta es una muy buena razón para implementar IEquatable<T>
(y obviamente anulando Equals(object)
también) para los tipos de valores. Basta con mirar el código predeterminado ValueType.Equals(object)
que recibe otra llamada. Es un asesino de rendimiento absoluto que introduce el boxeo, la evaluación del tipo y finalmente se retrae en la reflexión si alguno de los campos son tipos de referencia.
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;
}
En ciertos escenarios (como el uso del tipo de valor como clave en un diccionario) se puede asesinar el rendimiento de una sola falta.
Se te salve boxeo manejo/unboxing. Aquí la explicación buena y sencilla de que: http: //www.codeproject.com/Articles/20592/Implementing-IEquatable-Properly – Jviaches