Share via


CA2224: Equals beim Überladen von Gleichheitsoperatoren überschreiben

Eigenschaft Wert
Regel-ID CA2224
Titel Equals beim Überladen von Gleichheitsoperatoren ü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 implementiert den Gleichheitsoperator, überschreibt System.Object.Equals jedoch nicht.

Regelbeschreibung

Der Gleichheitsoperator ist als syntaktisch bequeme Methode für den Zugriff auf die Funktionalität der Equals-Methode gedacht. Wenn Sie den Gleichheitsoperator implementieren, muss seine Logik mit der von Equals identisch sein.

Hinweis

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

Behandeln von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, sollten Sie entweder die Implementierung des Gleichheitsoperators entfernen oder Equals überschreiben und festlegen, dass die beiden Methoden dieselben Werte zurückgeben. Wenn der Gleichheitsoperator kein inkonsistentes Verhalten verursacht, können Sie den Verstoß beheben, indem Sie eine Implementierung von Equals bereitstellen, mit der die Equals-Methode in der Basisklasse aufgerufen wird.

Wann sollten Warnungen unterdrückt werden?

Eine Warnung dieser Regel kann sicher unterdrückt werden, wenn der Gleichheitsoperator denselben Wert zurückgibt wie die vererbte Implementierung von Equals. Die Beispiele in diesem Artikel zeigen einen Typ, mit dem eine Warnung aus dieser Regel sicher unterdrückt werden kann.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Beispiel

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 GetHashCode() As Integer
        Return HashCode.Combine(X, Y)
    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        If pt1 Is Nothing OrElse pt2 Is Nothing Then
            Return False
        End If

        If pt1.GetType() <> pt2.GetType() Then
            Return False
        End If

        Return pt1.X = pt2.X AndAlso pt1.Y = pt2.Y
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        Return Not pt1 = pt2
    End Operator

End Class

Im folgenden Beispiel wird der Verstoß durch das Überschreiben von System.Object.Equals 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 HashCode.Combine(X, 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 X = pt.X AndAlso Y = pt.Y

    End Function

    Public Shared Operator =(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Object.Equals(pt1, pt2)
    End Operator

    Public Shared Operator <>(pt1 As Point, pt2 As Point) As Boolean
        ' Object.Equals calls Point.Equals(Object).
        Return Not Object.Equals(pt1, pt2)
    End Operator

End Class

Siehe auch