Compartilhar via


CA2011: Não atribuir a propriedade em seu próprio setter

Property Valor
ID da regra CA2011
Título Não atribuir a propriedade em seu próprio setter
Categoria Confiabilidade
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 10 Como sugestão

Causa

Uma propriedade recebeu acidentalmente um valor dentro de seu próprio acessador de conjunto.

Descrição da regra

Atribuir uma propriedade a si mesmo em seu acessador de conjunto leva a uma cadeia infinita de chamadas recursivas para o acessador do conjunto. Isso resulta em um StackOverflowException tempo de execução. Esse erro é comum quando a propriedade e o campo de suporte para armazenar o valor da propriedade têm nomes semelhantes. Em vez de atribuir o valor ao campo de suporte, ele foi atribuído acidentalmente à própria propriedade.

Como corrigir violações

Para corrigir violações, substitua a atribuição de violação à propriedade por uma atribuição ao campo de suporte ou alterne para usar uma propriedade automática. Por exemplo, o snippet de código a seguir mostra uma violação da regra e algumas maneiras de corrigi-la:

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; }
}

Quando suprimir avisos

É bom suprimir violações dessa regra se você tiver certeza de que as chamadas recursivas para o acessador do conjunto são protegidas condicionalmente para evitar a recursão infinita.

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

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

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

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

Para obter mais informações, confira Como suprimir avisos de análise de código.

Confira também