CA1815: É igual a substituição e o operador equals em tipos de valor

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

CheckId

CA1815

<strong>Categoria</strong>

Microsoft.Performance

Alteração significativa

Não-separável

Causa

Um tipo de valor público não substitui Object.Equals, ou não implementa o operador de igualdade (= =). Esta regra não verifica a enumerações.

Descrição da regra

Para tipos de valor, a implementação herdada do Equals usa a biblioteca de reflexão e compara o conteúdo de todos os campos. A reflexão é dispendiosa e comparar todos os campos de igualdade talvez seja desnecessário. Se você espera que os usuários para comparar ou classificar instâncias ou usá-los como chaves de tabela de hash, seu tipo de valor deve implementar Equals. Se a sua linguagem de programação oferece suporte a sobrecarga de operador, você também deve fornecer uma implementação dos operadores de igualdade e desigualdade.

Como corrigir violações

Para corrigir uma violação desta regra, fornecer uma implementação de Equals. Se possível, implemente o operador de igualdade.

Quando suprimir avisos

É seguro eliminar um aviso esta regra se ocorrências do tipo de valor não serão comparadas entre si.

Exemplo de uma violação.

Descrição

O exemplo a seguir mostra uma estrutura (tipo de valor) que viola essa regra.

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

Exemplo de como a correção

Descrição

O exemplo a seguir corrige a violação anterior, substituindo ValueTypeEquals() e implementar os operadores de igualdade (= =,! =).

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

Regras relacionadas

CA2224: É igual a substituição na sobrecarga de operador equals

CA2231: Sobrecarga de operador equals em substituição a ValueType.Equals

CA2226: Os operadores devem ter sobrecargas simétricas

Consulte também

Referência

Object.Equals