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
Ähnliche Regeln
- CA1046: Gleichheitsoperator für Referenztypen nicht überladen.
- CA2218: GetHashCode beim Überschreiben von Equals überschreiben.
- CA2225: Operatorüberladungen weisen benannte Alternativen auf.
- CA2226: Operatoren sollten symmetrische Überladungen aufweisen.
- CA2231: Überladen Sie den Gleichheitsoperator beim Überschreiben von ValueType.Equals.