CA1051: Não declarar campos de instância visíveis

Property Valor
ID da regra CA1051
Título Não declarar campos de instância visíveis
Categoria Projetar
Correção interruptiva ou sem interrupção Quebra
Habilitado por padrão no .NET 8 Não

Causa

Um tipo tem um campo de instância não privada.

Por padrão, essa regra apenas analisa os tipos visíveis externamente, mas isso é configurável.

Descrição da regra

O principal uso de um campo deve ser um como um detalhe da implementação. Os campos devem ser private ou internal e devem ser expostos usando propriedades. Acessar uma propriedade é tão fácil quanto acessar um campo, e o código nos acessadores de uma propriedade pode mudar à medida que os recursos do tipo se expandem sem introduzir alterações significativas.

As propriedades que apenas retornam o valor de um campo privado ou interno são otimizadas para funcionar no mesmo nível do acesso a um campo; o ganho de desempenho com o uso de campos visíveis externamente em vez de propriedades é mínimo. Visível externamente refere-se aos níveis de acessibilidade public, protected e protected internal (Public, Protected e Protected Friend no Visual Basic).

Além disso, os campos públicos não podem ser protegidos por demandas de link. (As demandas de link não se aplicam a aplicativos .NET Core.)

Como corrigir violações

Para corrigir uma violação desta regra, torne o campo private ou internal e exponha-o usando uma propriedade visível externamente.

Quando suprimir avisos

Suprima este aviso apenas se tiver certeza de que os consumidores precisam de acesso direto ao campo. Para a maioria dos aplicativos, os campos expostos não oferecem benefícios de desempenho ou manutenção em relação às propriedades.

Os consumidores podem precisar de acesso de campo nas seguintes situações:

  • Nos controles de conteúdo do ASP.NET Web Forms.
  • Quando a plataforma de destino usa ref para modificar campos, como estruturas model-view-viewmodel (MVVM) para WPF e UWP.

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 CA1051
// The code that's violating the rule is on this line.
#pragma warning restore CA1051

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.CA1051.severity = none

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

Incluir ou excluir APIs

Use as opções a seguir para configurar em quais partes de sua base de código executar esta regra.

Você pode configurar essas opções apenas para essa regra, para todas as regras às quais ela se aplica ou para todas as regras nessa categoria (Design) às quais ela se aplica. Para saber mais, confira Opções de configuração de regra de qualidade de código.

Incluir superfícies de API específicas

É possível configurar em quais partes da base de código essa regra deverá ser executada, com base na acessibilidade. Por exemplo, para especificar que a regra deve ser executada apenas na superfície de API não pública, adicione o seguinte par chave-valor a um arquivo .editorconfig no projeto:

dotnet_code_quality.CAXXXX.api_surface = private, internal

Excluir structs

Você pode excluir campos struct (Structure no Visual Basic) da análise.

dotnet_code_quality.ca1051.exclude_structs = true

Exemplo

O exemplo a seguir mostra um tipo (BadPublicInstanceFields) que viola essa regra. GoodPublicInstanceFields motra o código corrigido.

public class BadPublicInstanceFields
{
    // Violates rule DoNotDeclareVisibleInstanceFields.
    public int instanceData = 32;
}

public class GoodPublicInstanceFields
{
    private int instanceData = 32;

    public int InstanceData
    {
        get { return instanceData; }
        set { instanceData = value; }
    }
}

Confira também