Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2224 |
| Заголовок | Переопределение Equals при перегрузке оператора равно |
| Категория | Использование |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предложение |
| Применимые языки | Visual Basic |
Причина
Открытый тип реализует оператор равенства, но не переопределяет 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