Compartir a través de


CA1815: Reemplazar Equals y el operador Equals en los tipos de valor

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

Identificador de comprobación

CA1815

Categoría

Microsoft.Performance

Cambio problemático

Poco problemático

Motivo

Un tipo de valor público no reemplaza Object.Equals ni implementa al operador de igualdad (==).Esta regla no comprueba las enumeraciones.

Descripción de la regla

Para los tipos de valor, la implementación heredada de Equals utiliza la biblioteca de reflexiones y compara el contenido de todos los campos.Mediante el cálculo, la reflexión es cara y no es necesario comparar cada campo para comprobar si hay igualdad.Si espera que los usuarios comparen u ordenen las instancias, o las utiliza como claves de tabla hash, el tipo de valor debería implementar Equals.Si su lenguaje de programación admite la sobrecarga de operadores, también debería proporcionar una implementación de la igualdad y operadores de desigualdad.

Cómo corregir infracciones

Para corregir una infracción de esta regla, proporcione una implementación de Equals.Si puede, implemente al operador de igualdad.

Cuándo suprimir advertencias

Es seguro suprimir una advertencia de esta regla si las instancias del tipo de valor no se comparan entre sí.

Ejemplo de infracción

Descripción

En el siguiente ejemplo se muestra una estructura (tipo de valor) que infringe esta regla.

Código

using System; 

namespace Samples
{    
    // Violates this rule     
    public struct Point    
    {        
        private readonly int _X;        
        private readonly int _Y;         

        public Point(int x, int y)        
        {            
            _X = x;            
            _Y = y;        
        }         

        public int X        
        {            
            get { return _X; }        
        }         

        public int Y        
        {            
            get { return _Y; }        
        }    
    }
}

Ejemplo de cómo corregir

Descripción

En el ejemplo siguiente se invalida ValueType.Equals y se implementan los operadores de igualdad (==, !=) para corregir la infracción anterior.

Código

using System; 

namespace Samples
{    
    public struct Point : IEquatable<Point>    
    {        
        private readonly int _X;        
        private readonly int _Y;         

        public Point(int x, int y)        
        {            
            _X = x;            
            _Y = y;        
        }         

        public int X        
        {            
            get { return _X; }        
        }         

        public int Y        
        {            
            get { return _Y; }        
        }         

        public override int GetHashCode()        
        {            
            return _X ^ _Y;        
        }         

        public override bool Equals(object obj)        
        {            
            if (!(obj is Point))                
                return false;             

            return Equals((Point)obj);        
        }         

        public bool Equals(Point other)        
        {            
            if (_X != other._X)                
                return false;             

            return _Y == other._Y;        
        }         

        public static bool operator ==(Point point1, Point point2)        
        {            
            return point1.Equals(point2);        
        }         

        public static bool operator !=(Point point1, Point point2)        
        {            
            return !point1.Equals(point2);        
        }    
    }
}

Reglas relacionadas

CA2224: Reemplazar Equals al sobrecargar operadores de igualdad

CA2231: Sobrecargar el operador de igualdad al reemplazar el tipo de valor de igualdad

CA2226: Los operadores deben tener sobrecargar simétricas

Vea también

Referencia

Object.Equals