CA2218: Přepište GetHashCode při přepsání Equals

Vlastnost Hodnota
ID pravidla CA2218
Název Přepište GetHashCode při přepsání Equals
Kategorie Využití
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 Jako návrh

Příčina

Veřejný typ přepisuje System.Object.Equals , ale nepřepíše System.Object.GetHashCode.

Popis pravidla

GetHashCode vrátí hodnotu založenou na aktuální instanci, která je vhodná pro algoritmy hash a datové struktury, jako jsou tabulky hash. Dva objekty, které jsou stejného typu a jsou stejné, musí vrátit stejný hash kód, aby instance následujících typů fungovaly správně:

Poznámka:

Toto pravidlo platí jenom pro kód jazyka Visual Basic. Kompilátor jazyka C# vygeneruje samostatné upozornění CS0659.

Jak opravit porušení

Chcete-li opravit porušení tohoto pravidla, poskytněte implementaci GetHashCode. Pro dvojici objektů stejného typu se ujistěte, že implementace vrátí stejnou hodnotu, pokud vaše implementace Equals vrátí true hodnotu pro dvojici.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad třídy

Následující příklad ukazuje třídu (typ odkazu), která porušuje toto pravidlo.

' 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

Následující příklad opravuje porušení přepsáním 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

Viz také