Partilhar via


CA2011: Não atribuir propriedade dentro de seu setter

Property valor
ID da regra CA2011
Título Não atribua propriedade dentro de seu setter
Categoria Fiabilidade
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 10 Como sugestão

Motivo

Uma propriedade foi acidentalmente atribuída 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 de conjunto. Isto resulta num StackOverflowException durante o tempo de execução. Tal erro é comum quando a propriedade e o campo de apoio para armazenar o valor da propriedade têm nomes semelhantes. Em vez de atribuir o valor ao campo de apoio, ele foi atribuído acidentalmente à própria propriedade.

Como corrigir violações

Para corrigir violações, substitua a atribuição violadora à propriedade por uma atribuição ao campo de suporte ou alterne para usar uma propriedade automática. Por exemplo, o trecho 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

Não há problema em suprimir violações dessa regra se você tiver certeza de que as chamadas recursivas para o acessador definido são protegidas condicionalmente para evitar recursão infinita.

Suprimir um aviso

Se você quiser apenas suprimir uma única violação, adicione diretivas de pré-processador ao seu arquivo de origem para desativar e, em seguida, reativar 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 de um arquivo, pasta ou projeto, defina sua gravidade como none no arquivo de configuração.

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

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

Consulte também