Compartilhar via


Substituir GetHashCode na substituição Equals

TypeName

OverrideGetHashCodeOnOverridingEquals

CheckId

CA2218

Category (Categoria)

Microsoft.uso

Quebrando alterar

Não separável

Causa

Um tipo público substitui Object.Equals mas não substitui Object.GetHashCode.

Descrição da regra

GetHashCode Retorna um valor, com base na instância corrente, que é adequada para algoritmos de hashing e estruturas de dados, sistema autônomo uma tabela de hash. Dois objetos que são do mesmo tipo e são iguais devem retornar o mesmo código hash para garantir que instâncias de tipos a seguir funcionem corretamente:

Como corrigir violações

Para corrigir uma violação dessa regra, fornecer uma implementação de GetHashCode. Para um emparelhar de objetos do mesmo tipo, você deve garantir que a implementação retorna o mesmo valor se a implementação de Equals Retorna true para o emparelhar.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo de classe

Descrição

O exemplo a seguir mostra uma classe (tipo de referência) que violam essa regra.

Código

using System; 

namespace Samples
{    
    // Violates this rule    
    public class 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 bool Equals(object obj)        
        {            
            if (obj == null)                
                return false;             

            if (GetType() != obj.GetType())                
                return false;             

            Point point = (Point)obj;             

            if (_X != point.X)                
                return false;             

            return _Y == point.Y;        
        }    
    }
}

Comentários

O exemplo a seguir corrige a violação, substituindo GetHashCode.

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

Exemplo de estrutura

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

Comentários

O exemplo a seguir corrige a violação, substituindo GetHashCode.

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

Não sobrecarregar o operador equals em tipos de referência

Operador sobrecargas nomeou alternativas

Operadores devem ter sobrecargas simétricas

É igual a substituir na sobrecarga de operador é igual a

É igual a sobrecarga de operador em substituindo ValueType.Equals

Consulte também

Referência

Diretrizes para implementação é igual A e o operador de igualdade (==)

Object.Equals

Object.GetHashCode

HashTable