Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
| Właściwości | Wartość |
|---|---|
| Identyfikator reguły | CA2224 |
| Tytuł | Nadpisz metodę Equals przy przeciążaniu operatora porównania |
| Kategoria | Użycie |
| Poprawka łamiąca lub nienaruszająca | Niezgodność |
| Domyślnie włączone na platformie .NET 10 | Jako sugestia |
| Zastosowane języki | Visual Basic |
Przyczyna
Typ publiczny implementuje operator równości, ale nie zastępuje System.Object.Equals metody .
Opis reguły
Operator równości ma być składniowo wygodnym sposobem korzystania z funkcjonalności metody Equals. Jeśli implementujesz operator równości, jego logika musi być identyczna z operatorem Equals.
Uwaga
Ta reguła dotyczy tylko kodu Visual Basic. Kompilator języka C# generuje oddzielne ostrzeżenie CS0660.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy usunąć implementację operatora równości lub przesłonić metodę Equals, tak aby obie metody zwracały te same wartości. Jeśli operator równości nie wprowadza niespójnego zachowania, można naprawić naruszenie, dostarczając implementację Equals, która wywołuje metodę Equals z klasy bazowej.
Kiedy pomijać ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie z tej reguły, jeśli operator równości zwraca tę samą wartość co dziedziczona implementacja Equals. Przykłady w tym artykule zawierają typ, który może bezpiecznie pominąć ostrzeżenie z tej reguły.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykład
W poniższym przykładzie przedstawiono klasę (typ odwołania), która narusza tę regułę.
' 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
Poniższy przykład naprawia naruszenie poprzez zastąpienie System.Object.Equals.
' 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
Powiązane reguły
- CA1046: Nie przeciążaj operatora „equals” w typach referencyjnych
- CA2218: Należy przesłonić metodę GetHashCode, gdy przesłania się metodę Equals
- CA2225: Przeciążenia operatorów mają nazwane alternatywy
- CA2226: Operatory powinny mieć symetryczne przeciążenia
- CA2231: Przeciąż operator równości podczas przesłaniania metody ValueType.Equals