CA2224: substituir equals ao sobrecarregar operador equals
Property | Valor |
---|---|
ID da regra | CA2224 |
Título | Substituir Igual a ao sobrecarregar o operador igual a |
Categoria | Usage |
Correção interruptiva ou sem interrupção | Sem interrupção |
Habilitado por padrão no .NET 8 | Como sugestão |
Causa
Um tipo público implementa o operador de igualdade, mas não substitui System.Object.Equals.
Descrição da regra
O operador de igualdade é uma maneira sintaticamente prática de acessar a funcionalidade do método Equals. Se você implementar o operador de igualdade, a lógica deverá ser idêntica à de Equals.
Observação
Essa regra é aplicável comente ao código do Visual Basic. O compilador C# gera um aviso separado, CS0660.
Como corrigir violações
Para corrigir uma violação dessa regra, será necessário remover a implementação do operador de igualdade ou substituir Equals e fazer com que os dois métodos retornem os mesmos valores. Se o operador de igualdade não apresentar um comportamento inconsistente, você poderá corrigir a violação fornecendo uma implementação de Equals que chama o método Equals na classe base.
Quando suprimir avisos
É seguro suprimir um aviso dessa regra se o operador de igualdade retornar o mesmo valor que a implementação herdada de Equals. Os exemplos neste artigo incluem um tipo que pode suprimir com segurança um aviso dessa regra.
Suprimir um aviso
Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.
#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none
no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Para obter mais informações, confira Como suprimir avisos de análise de código.
Exemplo
O exemplo a seguir mostra uma classe (tipo de referência) que viola essa regra.
' This class violates the rule.
Public Class Point
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Overrides Function GetHashCode() As Integer
Return HashCode.Combine(X, Y)
End Function
Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
If pt1 Is Nothing OrElse pt2 Is Nothing Then
Return False
End If
If pt1.GetType() <> pt2.GetType() Then
Return False
End If
Return pt1.X = pt2.X AndAlso pt1.Y = pt2.Y
End Operator
Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
Return Not pt1 = pt2
End Operator
End Class
O exemplo a seguir corrige a violação substituindo System.Object.Equals.
' This class satisfies the rule.
Public Class Point
Public Property X As Integer
Public Property Y As Integer
Public Sub New(x As Integer, y As Integer)
Me.X = x
Me.Y = y
End Sub
Public Overrides Function GetHashCode() As Integer
Return HashCode.Combine(X, Y)
End Function
Public Overrides Function Equals(obj As Object) As Boolean
If obj = Nothing Then
Return False
End If
If [GetType]() <> obj.GetType() Then
Return False
End If
Dim pt As Point = CType(obj, Point)
Return X = pt.X AndAlso Y = pt.Y
End Function
Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
' Object.Equals calls Point.Equals(Object).
Return Object.Equals(pt1, pt2)
End Operator
Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
' Object.Equals calls Point.Equals(Object).
Return Not Object.Equals(pt1, pt2)
End Operator
End Class
Regras relacionadas
- CA1046: Não sobrecarregar o operador equals em tipos de referência
- CA2218: Substituir GetHashCode ao substituir Equals
- CA2225: Sobrecargas de operador têm alternativas nomeadas
- CA2226: Operadores devem ter sobrecargas simétricas
- CA2231: Sobrecarregar operador equals ao substituir ValueType.Equals