CA2218: Zastąp GetHashCode przy przesłanianiu Equals

Właściwości Wartość
Identyfikator reguły CA2218
Tytuł Przesłaniaj metodę GetHashCode w razie przesłaniania metody Equals
Kategoria Użycie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako sugestia

Przyczyna

Przesłonięć System.Object.Equals typu publicznego, ale nie zastępuje System.Object.GetHashCodeelementu .

Opis reguły

GetHashCode Zwraca wartość opartą na bieżącym wystąpieniu, która jest odpowiednia dla algorytmów wyznaczania wartości skrótu i struktur danych, takich jak tabele skrótów. Dwa obiekty, które są tego samego typu i są równe, muszą zwrócić ten sam kod skrótu, aby upewnić się, że wystąpienia następujących typów działają poprawnie:

Uwaga

Ta reguła dotyczy tylko kodu Visual Basic. Kompilator języka C# generuje oddzielne ostrzeżenie CS0659.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, podaj implementację elementu GetHashCode. W przypadku pary obiektów tego samego typu upewnij się, że implementacja zwraca tę samą wartość, jeśli implementacja Equals zwraca wartość true dla pary.

Kiedy pomijać ostrzeżenia

Nie pomijaj ostrzeżeń dla tej reguły.

Przykład klasy

W poniższym przykładzie przedstawiono klasę (typ odwołania), która narusza tę regułę.

' 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 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

End Class

Poniższy przykład naprawia naruszenie przez zastąpienie .GetHashCode()

' 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 X Or 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 Equals(pt)

    End Function

    Public Overloads Function Equals(pt As Point) As Boolean
        Return X = pt.X AndAlso Y = pt.Y
    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        Return pt1.Equals(pt2)
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        Return Not pt1.Equals(pt2)
    End Operator

End Class

Zobacz też