Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
| Propriedade | valor |
|---|---|
| ID da regra | CA2224 |
| Título | Substituir Equals na sobrecarga do operador 'equals' |
| Categoria | Utilização |
| A correção causa interrupção ou não | Ininterrupto |
| Habilitado por padrão no .NET 10 | Como sugestão |
| Línguas aplicáveis | Visual Basic |
Motivo
Um tipo público implementa o operador de igualdade, mas não substitui o System.Object.Equals método.
Descrição da regra
O operador de igualdade destina-se a ser uma maneira sintaticamente conveniente de acessar a funcionalidade do Equals método. Se você implementar o operador de igualdade, sua lógica deverá ser idêntica à do Equals.
Nota
Esta regra só se aplica 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, você deve 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 introduzir um comportamento inconsistente, poderá corrigir a violação fornecendo uma implementação de Equals que chame 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 do Equals. Os exemplos neste artigo incluem um tipo que é capaz de suprimir com segurança um aviso desta regra.
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 CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Para desabilitar a regra de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Para obter mais informações, consulte 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 ao sobrepor 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 conexas
- CA1046: Não sobrecarregar operador igual em tipos de referência
- CA2218: Substituir GetHashCode ao substituir Equals
- CA2225: As sobrecargas do operador nomearam suplentes
- CA2226: Os operadores devem ter sobrecargas simétricas
- CA2231: Sobrecarregar o operador de igualdade ao substituir ValueType.Equals