Share via


CA2218: Åsidosätt GetHashCode vid åsidosättande av lika med

Property Värde
Regel-ID CA2218
Title Åsidosätt GetHashCode vid åsidosättande av lika med
Kategori Användning
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som förslag

Orsak

En offentlig typ åsidosätter men åsidosätter System.Object.EqualsSystem.Object.GetHashCodeinte .

Regelbeskrivning

GetHashCode returnerar ett värde, baserat på den aktuella instansen, som passar för hash-algoritmer och datastrukturer som hash-tabeller. Två objekt som är av samma typ och är lika måste returnera samma hash-kod för att säkerställa att instanser av följande typer fungerar korrekt:

Kommentar

Den här regeln gäller endast för Visual Basic-kod. C#-kompilatorn genererar en separat varning, CS0659.

Så här åtgärdar du överträdelser

Om du vill åtgärda ett brott mot den här regeln anger du en implementering av GetHashCode. För ett par objekt av samma typ kontrollerar du att implementeringen returnerar samma värde om implementeringen av Equals returnerar true för paret.

När du ska ignorera varningar

Ignorera inte en varning från den här regeln.

Klassexempel

I följande exempel visas en klass (referenstyp) som bryter mot den här regeln.

' 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

I följande exempel åtgärdas överträdelsen genom att GetHashCode()åsidosätta .

' 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

Se även