Megosztás a következőn keresztül:


CA2218: A GetHashCode felülbírálása egyenlők felülbírálásakor

Tulajdonság Érték
Szabályazonosító CA2218
Cím GetHashCode felülbírálása egyenlők felülbírálásakor
Kategória Használat
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Javaslatként

Ok

Nyilvános típusú felülbírálások System.Object.Equals , de nem felülbírálják System.Object.GetHashCode.

Szabály leírása

GetHashCode Az aktuális példányon alapuló értéket ad vissza, amely megfelel a kivonatoló algoritmusoknak és adatstruktúráknak, például kivonattábláknak. Két azonos típusú és egyenlő objektumnak ugyanazt a kivonatkódot kell visszaadnia, hogy a következő típusok példányai megfelelően működjenek:

Megjegyzés:

Ez a szabály csak a Visual Basic-kódra vonatkozik. A C#-fordító külön figyelmeztetést hoz létre, a CS0659-et.

Szabálysértések kijavítása

A szabály megsértésének kijavításához adja meg a szabály implementálását GetHashCode. Egy azonos típusú objektumpár esetében győződjön meg arról, hogy az implementáció ugyanazt az értéket adja vissza, ha a pár visszatérési Equals értéke megegyezik true .

Mikor kell letiltani a figyelmeztetéseket?

Ne tiltsa el a szabály figyelmeztetését.

Példa osztályra

Az alábbi példa egy olyan osztályt (referenciatípust) mutat be, amely megsérti ezt a szabályt.

' 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

Az alábbi példa felülírással oldja meg a szabálysértést 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

Kapcsolódó információk