Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA1046 |
| Заголовок | Не перегружайте оператор равенства для ссылочных типов |
| Категория | Проектирование |
| Исправление является критическим или не критическим | Срочное |
| Включен по умолчанию в .NET 10 | Нет |
| Применимые языки | C# и Visual Basic |
Причина
Общедоступный или вложенный общедоступный ссылочный тип перегружает оператор равенства.
Описание правила
Реализация оператора равенства по умолчанию почти всегда правильно работает для ссылочных типов. По умолчанию две ссылки равны, если они указывают на один объект.
Устранение нарушений
Чтобы устранить нарушение этого правила, удалите реализацию оператора равенства.
Когда лучше отключить предупреждения
Можно безопасно отключить предупреждения из этого правила, если ссылочный тип ведет себя как встроенный тип значения. Если имеет смысл выполнять операции сложения или вычитания для экземпляров типа, то, возможно, целесообразно реализовать оператор равенства и подавить это нарушение.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA1046
// The code that's violating the rule is on this line.
#pragma warning restore CA1046
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA1046.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Настройка кода для анализа
Используйте следующий параметр, чтобы выбрать части базы кода для применения этого правила.
Этот параметр можно настроить только для этого правила, для всех правил, к которым он применяется, или для всех правил в этой категории (конструкторе), к которым она применяется. Дополнительные сведения см. в статье Параметры конфигурации правила качества кода.
Включите конкретные поверхности API
Вы можете настроить компоненты базы кода для выполнения этого правила на основе их специальных возможностей, задав параметр api_surface. Например, чтобы указать, что правило должно выполняться только для непубличной поверхности API, добавьте следующую пару "ключ-значение" в файл .editorconfig в ваш проект:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Заметка
Замените XXXX частью CAXXXX идентификатором применимого правила.
Пример 1
В следующем примере демонстрируется поведение по умолчанию при сравнении двух ссылок.
public class MyReferenceType
{
private int a, b;
public MyReferenceType(int a, int b)
{
this.a = a;
this.b = b;
}
public override string ToString()
{
return String.Format($"({a},{b})");
}
}
Пример 2
В следующем приложении сравниваются некоторые ссылки.
public class ReferenceTypeEquality
{
public static void Main1046()
{
MyReferenceType a = new(2, 2);
MyReferenceType b = new(2, 2);
MyReferenceType c = a;
Console.WriteLine($"a = new {a} and b = new {b} are equal? {(a.Equals(b) ? "Yes" : "No")}");
Console.WriteLine($"c and a are equal? {(c.Equals(a) ? "Yes" : "No")}");
Console.WriteLine($"b and a are == ? {(b == a ? "Yes" : "No")}");
Console.WriteLine($"c and a are == ? {(c == a ? "Yes" : "No")}");
}
}
В примере получается следующий вывод.
a = new (2,2) and b = new (2,2) are equal? No
c and a are equal? Yes
b and a are == ? No
c and a are == ? Yes