CA2224: переопределяйте Equals при перегрузке оператора равенства
Свойство | Значение |
---|---|
Идентификатор правила | CA2224 |
Заголовок | Переопределение Equals при перегрузке оператора равно |
Категория | Использование |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | Как предложение |
Причина
Открытый тип реализует оператор равенства, но не переопределяет System.Object.Equals.
Описание правила
Оператор равенства должен быть синтаксически удобным способом доступа к функциям метода Equals. При реализации оператора равенства его логика должна быть идентична логике Equals.
Примечание.
Это правило применяется только к коду Visual Basic. Компилятор C# создает отдельное предупреждение, CS0660.
Устранение нарушений
Чтобы устранить нарушение этого правила, необходимо либо удалить реализацию оператора равенства, либо переопределить Equals, чтобы два метода возвращали одинаковые значения. Если оператор равенства не приводит к несогласованному поведению, можно устранить нарушение, предоставив реализацию Equals, которая вызывает метод Equals в базовом классе.
Когда лучше отключить предупреждения
Можно отключить предупреждение для этого правила, если оператор равенства возвращает то же значение, что и унаследованная реализация Equals. Примеры в этой статье включают тип, который может безопасно отключить предупреждение для этого правила.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2224
// The code that's violating the rule is on this line.
#pragma warning restore CA2224
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2224.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Пример
В следующем примере показан класс (ссылочный тип), нарушающий правило.
' 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
В следующем примере нарушение устраняется путем переопределения 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
Связанные правила
- CA1046: не перегружайте оператор равенства для ссылочных типов
- CA2218: переопределяйте GetHashCode при переопределении Equals
- CA2225: для перезагрузок оператора существуют дополнения с именами
- CA2226: перегрузки операторов должны быть симметричны
- CA2231: перегружать равенство операторов следует при перегрузке ValueType.Equals