CA1815: Substituir é igual e operador é igual em tipos de valor
Propriedade | valor |
---|---|
ID da regra | CA1815 |
Cargo | Substituir igual e operador igual em tipos de valor |
Categoria | Desempenho |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Não |
Causa
Um tipo de valor não substitui System.Object.Equals ou não implementa o operador de igualdade (==). Esta regra não verifica enumerações.
Por padrão, essa regra examina apenas tipos visíveis externamente, mas isso é configurável.
Descrição da regra
Para tipos de valor não blittable, a implementação herdada de usa a System.Reflection biblioteca para comparar o conteúdo de Equals todos os campos. A reflexão é computacionalmente cara, e comparar todos os campos para a igualdade pode ser desnecessário. Se você espera que os usuários comparem ou classifiquem instâncias, ou as usem como chaves de tabela de hash, seu tipo de valor deve implementar Equals. Se sua linguagem de programação suporta sobrecarga de operadores, 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 do Equals. Se puder, implemente o operador de igualdade.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se instâncias do tipo de valor não forem comparadas entre si.
Suprimir um aviso
Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar a regra.
#pragma warning disable CA1815
// The code that's violating the rule is on this line.
#pragma warning restore CA1815
Para desabilitar a regra para um arquivo, pasta ou projeto, defina sua severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA1815.severity = none
Para obter mais informações, consulte Como suprimir avisos de análise de código.
Configurar código para análise
Use a opção a seguir para configurar em quais partes da base de código executar essa regra.
Você pode configurar essa opção apenas para esta regra, para todas as regras às quais ela se aplica ou para todas as regras nesta categoria (Desempenho) às quais ela se aplica. Para obter mais informações, consulte Opções de configuração da regra de qualidade de código.
Incluir superfícies de API específicas
Você pode configurar em quais partes da sua base de código executar essa regra, com base em sua acessibilidade. Por exemplo, para especificar que a regra deve ser executada somente na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig em seu projeto:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Exemplo
O código a seguir mostra uma estrutura (tipo de valor) que viola essa regra:
// Violates this rule
public struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
O código a seguir corrige a violação anterior substituindo System.ValueType.Equals e implementando os operadores de igualdade (==
e !=
):
public struct Point : IEquatable<Point>
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
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 conexas
- CA2231: Operador de sobrecarga é igual ao substituir ValueType.Equals
- CA2226: Os operadores devem ter sobrecargas simétricas