CA2011: не назначайте свойство в своем наборе

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

Причина

Свойству было случайно присвоено значение в его методе доступа set.

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

Присвоение свойству самого себя в методе доступа set приводит к бесконечной цепочке рекурсивных вызовов метода доступа set. Это приводит к возникновению StackOverflowException во время выполнения. Такая ошибка обычно происходит, когда свойство и резервное поле для хранения значения свойства имеют похожие имена. Вместо присвоения значения резервному полю оно было случайно назначено самому свойству.

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

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

public class C
{
    // Backing field for property 'P'
    private int p;

    public int P
    {
        get
        {
            return p;
        }
        set
        {
            // CA2011: Accidentally assigned to property, instead of the backing field.
            P = value;
        }
    }
}
public class C
{
    // Backing field for property 'P'
    private int _p;

    public int P
    {
        get
        {
            return _p;
        }
        set
        {
            // Option 1: Assign to backing field and rename the backing field for clarity.
            _p = value;
        }
    }
}
public class C
{
    // Option 2: Use auto-property.
    public int P { get; set; }
}

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

Если вы уверены, что рекурсивные вызовы метода доступа set являются условно защищенными, чтобы предотвратить бесконечную рекурсию, можно отключить предупреждения для этого правила.

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

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

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

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

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

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

См. также