Compartilhar via


É igual a substituir e operador é igual a em tipos de valor

TypeName

OverrideEqualsAndOperatorEqualsOnValueTypes

CheckId

CA1815

Category (Categoria)

Microsoft.desempenho

Quebrando alterar

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

Descrição da regra

Para tipos de valor, a implementação herdada de Equals usa a biblioteca de reflexão e compara o Sumário de todos os campos. A reflexão é computacionalmente caro e comparar todos os campos de igualdade pode ser desnecessário.Se você espera que sistema autônomo usuários comparar ou classificar ocorrências ou usá-los sistema autônomo chaves de tabela de hash, o tipo de valor deve implementar Equals. Se 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 dessa regra, fornecer uma implementação de Equals. Se possível, implemente o operador de igualdade.

Quando suprimir avisos

É seguro eliminar um aviso essa regra se ocorrências do tipo de valor 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 corrigir

Descrição

O exemplo a seguir corrige a violação anterior, substituindo ValueTypeEquals() e a implementação de 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

É igual a substituir na sobrecarga de operador é igual a

É igual a sobrecarga de operador em substituindo ValueType.Equals

Operadores devem ter sobrecargas simétricas

Consulte também

Referência

Object.Equals