Sobrecargar el operador de igualdad al invalidar ValueType.Equals
Actualización: noviembre 2007
Nombre de tipo |
OverloadOperatorEqualsOnOverridingValueTypeEquals |
Identificador de comprobación |
CA2231 |
Categoría |
Microsoft.Usage |
Cambio problemático |
No problemático |
Motivo
Un tipo de valor reemplaza Object.Equals pero no implementa al operador de igualdad.
Descripción de la regla
En la mayoría de los lenguajes de programación no hay un modelo de implementación predeterminada del operador de igualdad (==) para tipos de valor. Si su lenguaje de programación admite las sobrecargas de operador, debería considerar implementar el operador de igualdad. Su comportamiento debería ser idéntico al de Equals.
No puede utilizar al operador de igualdad predeterminado en una implementación sobrecargada del operador de igualdad. Con ello se producirá un desbordamiento de pila. Para implementar el operador de igualdad, utilice el método Object.Equals en la implementación. Por ejemplo:
If (Object.ReferenceEquals(left, Nothing)) Then
Return Object.ReferenceEquals(right, Nothing)
Else
Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null))
return Object.ReferenceEquals(right, null);
return left.Equals(right);
Cómo corregir infracciones
Para corregir una infracción de esta regla, implemente el operador de igualdad.
Cuándo suprimir advertencias
Es seguro suprimir una advertencia de esta regla; sin embargo, se recomienda proporcionar el operador de igualdad, si es posible.
Ejemplo
El siguiente ejemplo se define un tipo que infringe esta regla.
using System;
namespace UsageLibrary
{
public struct PointWithoutHash
{
private int x,y;
public PointWithoutHash(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return String.Format("({0},{1})",x,y);
}
public int X {get {return x;}}
public int Y {get {return x;}}
// Violates rule: OverrideGetHashCodeOnOverridingEquals.
// Violates rule: OverrideOperatorEqualsOnOverridingValueTypeEquals.
public override bool Equals (object obj)
{
if (obj.GetType() != typeof(PointWithoutHash))
return false;
PointWithoutHash p = (PointWithoutHash)obj;
return ((this.x == p.x) && (this.y == p.y));
}
}
}
Reglas relacionadas
No sobrecargar el operador Equals en tipos de referencia
Las sobrecargas del operador tienen alternativas con nombre
Los operadores deben tener sobrecargar simétricas
Reemplazar Equals al sobrecargar el operador de igualdad
Reemplazar GetHashCode en el método reemplazable Equals