Бөлісу құралы:


Не присваивайте свойству его собственное значение

Свойство Значение
Идентификатор правила CA2245
Заголовок Не назначайте свойство самому объекту
Категория Использование
Исправление является критическим или не критическим неразрывный
Включен по умолчанию в .NET 10 Как предложение
Применимые языки C# и Visual Basic

Причина

Свойство было случайно назначено самому себе.

Описание правила

Компилятор C# генерирует предупреждение CS1717: присваивание сделано той же самой переменной; вы имели в виду присвоить что-то другое?, когда полю, локальной переменной или параметру присваивается значение самого себя. Такая ошибка часто встречается в том случае, когда имя локального символа, символа параметра или поля аналогично имени другого символа в области. Вместо разных символов в левой и правой частях назначения использовался один и тот же символ. Это приводит к избыточному назначению значения самому себе и, как правило, указывает на функциональную ошибку.

Назначение свойства самому себе также является функциональной ошибкой практически во всех реальных случаях. Однако в некоторых крайних случаях получение значения свойства может иметь побочные эффекты, а новое значение свойства отличается от исходного значения. Если это так, самоназначение свойства не является избыточным и не подлежит удалению. Это предотвращает вывод компилятором предупреждения CS1717 о назначении свойства самому себе, не приводя к нарушению совместимости в этих случаях.

Правило CA2245 призвано устранить эту проблему. Оно сообщает о нарушении назначения свойства самому себе, чтобы помочь исправить эти функциональные ошибки. Для небольшого набора крайних случаев, когда назначение свойства самому себе является желательным, нарушения CA2245 можно подавить в исходном коде с помощью соответствующего комментария, содержащего обоснование.

Устранение нарушений

Чтобы устранить нарушения, в левой и правой частях назначения следует использовать разные символы. Например, в следующем фрагменте кода показано нарушение правила и способы его устранения:

public class C
{
    private int p = 0;
    public int P { get; private set; }

    public void M(int p)
    {
        // CS1717: Accidentally assigned the parameter 'p' to itself.
        p = p;

        // CA2245: Accidentally assigned the property 'P' to itself.
        P = P;
    }
}
public class C
{
    private int p = 0;
    public int P { get; private set; }

    public void M(int p)
    {
        // No violation, now the parameter is assigned to the field.
        this.p = p;

        // No violation, now the parameter is assigned to the property.
        P = p;
    }
}

Когда лучше отключить предупреждения

Безопасно игнорировать нарушения в рамках этого правила, если извлечение значения свойства может иметь побочные эффекты, а новое значение свойства отличается от исходного. Если это так, само-присвоение свойства не является избыточным. Чтобы задокументировать это как ожидаемое поведение, в подавление следует добавить комментарий с обоснованием.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA2245
// The code that's violating the rule is on this line.
#pragma warning restore CA2245

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA2245.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

См. также