CA2218: substituir GetHashCode em igualdades de substituição
TypeName |
OverrideGetHashCodeOnOverridingEquals |
CheckId |
CA2218 |
Categoria |
Microsoft.Usage |
Alteração Significativa |
Sem Quebra |
Causa
As substituições públicas Object.Equals de um tipo mas não substitui Object.GetHashCode.
Descrição da Regra
GetHashCode retorna um valor, com base na instância atual, que é adequada para algoritmos de hash e estruturas de dados como uma tabela de hash.Dois objetos que têm o mesmo tipo e são iguais devem retornar o mesmo código hash para garantir que as instâncias dos tipos funcionem corretamente:
Dictionary
SortDictionary
SortList
HybredDictionary
Tipos que implementam IEqualityComparer
Como Corrigir Violações
Para corrigir uma violação desta regra, forneça uma implementação de GetHashCode.Para um par de objetos do mesmo tipo, você deve assegurar que a implementação retorna o mesmo valor se sua implementação de Equals retorna true para o par.
Quando Suprimir Alertas
Não elimine um alerta desta regra.
Exemplo da classe
Descrição
O exemplo a seguir mostra uma classe (tipo de referência) que viola esta 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 esta 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
CA1046: não sobrecarregar igualdades de operador em tipos de referência
CA2225: as sobrecargas do operador têm alternativas nomeadas
CA2226: os operadores devem ter sobrecargas simétricas
CA2224: substituir igualdades em igualdades de operador de sobrecarga
CA2231: sobrecarregar igualdades de operador em ValueType.Equals substituídos
Consulte também
Referência
Outros recursos
Guidelines for Implementing Equals and the Equality Operator (==)