CA2245: не присваивайте свойству себе

Свойство Значение
Идентификатор правила CA2245
Заголовок не назначайте свойство самому себе
Категория Использование
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 Как предложение

Причина

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

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

Компилятор 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

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

См. также