CA1815: следует переопределять равенства и равенства операторов в типах значений
Свойство | Значение |
---|---|
Идентификатор правила | CA1815 |
Заголовок | Переопределяйте операторы Equals и равенства для типов значений |
Категория | Производительность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 8 | No |
Причина
Тип значения не переопределяет System.Object.Equals или не реализует оператор равенства (==). Это правило не проверяет перечисления.
По умолчанию это правило проверяет только видимые извне типы, но это поведение можно настроить.
Описание правила
Для типов значений, которые не являются непреобразуемыми, унаследованная реализация Equals использует библиотеку System.Reflection для сравнения содержимого всех полей. Отражение является процессом, требующим с точки зрения вычислений больших затрат, и сравнение каждого поля на равенство может быть лишним. Если предполагается, что пользователи будут сравнивать, сортировать экземпляры или использовать их в качестве ключей хэш-таблиц, тип значения должен реализовывать Equals. Если язык программирования поддерживает перегрузку операторов, также необходимо предоставить реализацию операторов равенства и неравенства.
Устранение нарушений
Чтобы устранить нарушение этого правила, предоставьте реализацию Equals. Если это возможно, реализуйте оператор равенства.
Когда лучше отключить предупреждения
Предупреждение для этого правила можно отключить, если экземпляры типа значения не будут сравниваться друг с другом.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1815
// The code that's violating the rule is on this line.
#pragma warning restore CA1815
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1815.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.
Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (производительности), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Включение определенных контактных зон API
Вы можете настроить, для каких частей базы кода следует выполнять это правило в зависимости от их доступности. Например, чтобы указать, что правило должно выполняться только для закрытой контактной зоны API, добавьте следующую пару "ключ-значение" в файл EDITORCONFIG в своем проекте:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Пример
В следующем коде показана структура (тип значения), которая нарушает это правило:
// Violates this rule
public struct Point
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
}
Следующий код устраняет предыдущее нарушение путем переопределения System.ValueType.Equals и реализации операторов равенства (==
и !=
):
public struct Point : IEquatable<Point>
{
public Point(int x, int y)
{
X = x;
Y = y;
}
public int X { get; }
public int Y { get; }
public override int GetHashCode()
{
return X ^ Y;
}
public override bool Equals(object? obj)
{
if (!(obj is Point))
return false;
return Equals((Point)obj);
}
public bool Equals(Point other)
{
if (X != other.X)
return false;
return Y == other.Y;
}
public static bool operator ==(Point point1, Point point2)
{
return point1.Equals(point2);
}
public static bool operator !=(Point point1, Point point2)
{
return !point1.Equals(point2);
}
}
Связанные правила
- CA2231: перегружать равенство операторов следует при перегрузке ValueType.Equals
- CA2226: перегрузки операторов должны быть симметричны