Freigeben über


CA2218: GetHashCode beim Überschreiben von Equals überschreiben.

Eigenschaft Wert
Regel-ID CA2218
Titel GetHashCode beim Überschreiben von Equals überschreiben.
Kategorie Verwendung
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Als Vorschlag

Ursache

Ein öffentlicher Typ überschreibt System.Object.Equals, jedoch nicht System.Object.GetHashCode.

Regelbeschreibung

GetHashCode gibt einen Wert auf der Grundlage der aktuellen Instanz zurück, der sich für Hashalgorithmen und Datenstrukturen eignet, z. B. für Hashtabellen. Zwei Objekte, die den gleichen Typ und Wert aufweisen, müssen auch den gleichen Hashcode zurückgeben. So wird sichergestellt, dass die Instanzen der folgenden Typen ordnungsgemäß funktionieren:

Hinweis

Diese Regel gilt nur für Visual Basic-Code. Der C#-Compiler generiert eine andere Warnung, CS0659.

Behandeln von Verstößen

Implementieren Sie eine Instanz von GetHashCode, um einen Verstoß gegen diese Regel zu korrigieren. Wenn ein Objektpaar den gleichen Typ aufweist, müssen Sie dafür sorgen, dass die Implementierung den gleichen Wert zurückgibt, wenn Ihre Implementierung von Equals den Wert true für das Paar zurückgibt.

Wann sollten Warnungen unterdrückt werden?

Unterdrücken Sie keine Warnung dieser Regel.

Klassenbeispiel

Das folgende Beispiel zeigt eine Klasse (Verweistyp), die gegen diese Regel verstößt.

' 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

Im folgenden Beispiel wird der Verstoß durch das Überschreiben von GetHashCode() korrigiert.

' 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

Siehe auch