Partilhar via


CA1815: substituir igualdades e igualdades de operador em tipos de valor

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

CheckId

CA1815

Categoria

Microsoft.Performance

Alteração Significativa

Sem quebra

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 enumerações.

Descrição da Regra

Para tipos de valor, a implementação herdada de Equals usa a biblioteca de Reflexo (Reflection library), e compara o conteúdo de todos os campos.Reflexão é computacionalmente cara, e comparar cada campo por igualdade pode ser desnecessário.Se você pretende que usuários classifiquem ou comparem instâncias, ou as usa como chaves de tabela de hash, seu tipo de valor deve implementar Equals.Se sua linguagem de programação oferece suporte à 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, forneça uma implementação de Equals.Se você puder, implemente o operador de igualdade.

Quando Suprimir Alertas

É seguro suprimir um aviso desta regra se as instâ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 esta 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 Corrigir

Descrição

O exemplo a seguir corrige a violação anterior substituindo ValueType.Equals e implementando 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: substituir igualdades em igualdades de operador de sobrecarga

CA2231: sobrecarregar igualdades de operador em ValueType.Equals substituídos

CA2226: os operadores devem ter sobrecargas simétricas

Consulte também

Referência

Object.Equals