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


CA2011: Не устанавливайте значение свойства внутри его метода установки

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

Причина

Свойству было случайно присвоено значение в его методе доступа 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

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

См. также