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