CA2218: Substituir GetHashCode ao substituir Equals
Item | Valor |
---|---|
RuleId | CA2218 |
Categoria | Microsoft.Usage |
Alteração da falha | Sem interrupção |
Causa
Um tipo público substitui System.Object.Equals, mas não substitui System.Object.GetHashCode.
Descrição da regra
GetHashCode retorna um valor, com base na instância atual, adequado para algoritmos de hash e estruturas de dados como uma tabela de hash. Dois objetos do mesmo tipo e iguais devem retornar o mesmo código hash para garantir que as instâncias dos seguintes tipos funcionem corretamente:
Tipos que implementam System.Collections.Generic.IEqualityComparer<T>
Como corrigir violações
Para corrigir uma violação dessa regra, forneça uma implementação de GetHashCode. Para um par de objetos do mesmo tipo, garanta que a implementação retorne o mesmo valor se a sua implementação de Equals retornar true
para o par.
Quando suprimir avisos
Não suprima um aviso nessa regra.
Exemplo de classe
Descrição
O exemplo a seguir mostra uma classe (tipo de referência) que viola 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 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 o operador equals em tipos de referência
CA2225: Sobrecargas de operador têm alternativas nomeadas
CA2226: Operadores devem ter sobrecargas simétricas
CA2224: Substituir equals ao sobrecarregar operador equals
CA2231: Sobrecarregar operador equals ao substituir ValueType.Equals
Confira também
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de