Partilhar via


CA2224: Reimplementar Equals() ao sobrecarregar o operador de igualdade

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

Consulte também