Share via


CA2218: GetHashCode overschrijven bij het overschrijven van Equals

Eigenschappen Weergegeven als
Regel-id CA2218
Titel GetHashCode overschrijven bij het overschrijven van equals
Categorie Gebruik
Oplossing is brekend of niet-brekend Niet-brekend
Standaard ingeschakeld in .NET 9 Als suggestie

Oorzaak

Een openbaar type wordt overschreven System.Object.Equals , maar wordt niet overschreven System.Object.GetHashCode.

Beschrijving van regel

GetHashCode retourneert een waarde op basis van het huidige exemplaar dat geschikt is voor hash-algoritmen en gegevensstructuren zoals hashtabellen. Twee objecten die hetzelfde type zijn en gelijk zijn, moeten dezelfde hash-code retourneren om ervoor te zorgen dat exemplaren van de volgende typen correct werken:

Notitie

Deze regel is alleen van toepassing op Visual Basic-code. De C#-compiler genereert een afzonderlijke waarschuwing, CS0659.

Schendingen oplossen

Als u een schending van deze regel wilt oplossen, geeft u een implementatie van GetHashCode. Voor een paar objecten van hetzelfde type moet u ervoor zorgen dat de implementatie dezelfde waarde retourneert als de implementatie van Equals retourneert true voor het paar.

Wanneer waarschuwingen onderdrukken

Een waarschuwing van deze regel niet onderdrukken.

Voorbeeld van klasse

In het volgende voorbeeld ziet u een klasse (verwijzingstype) die deze regel schendt.

' 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

In het volgende voorbeeld wordt de schending opgelost door deze te overschrijven 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

Zie ook