Compartilhar via


CA1044: Propriedades não devem ser somente gravação

Property Valor
ID da regra CA1044
Título Propriedades não devem ser somente gravação
Categoria Projetar
Correção interruptiva ou sem interrupção Quebra
Habilitado por padrão no .NET 8 Não

Causa

Uma propriedade tem um acessador definido, mas não um acessador get.

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

Descrição da regra

Os acessadores get fornecem acesso de leitura a uma propriedade, e os acessadores set fornecem acesso de gravação. Embora seja aceitável e normalmente necessário ter uma propriedade somente leitura, as diretrizes de design proíbem o uso de propriedades somente gravação. Isso ocorre porque a permissão para que um usuário defina um valor e o impedimento posterior para ele exiba esse valor não dão nenhuma segurança. Além disso, sem acesso de leitura, o estado de objetos compartilhados não pode ser exibido, o que limita sua utilidade.

Como corrigir violações

Para corrigir uma violação dessa regra, adicione um acessador get à propriedade. Como alternativa, se o comportamento de uma propriedade somente gravação for necessário, considere converter essa propriedade em um método.

Quando suprimir avisos

É recomendável não suprimir avisos dessa regra.

Configurar código para análise

Use a opção a seguir para configurar em quais partes da base de código essa regra deve ser executada.

Você pode configurar essa opção 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 deverá 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

Exemplo

No exemplo a seguir, BadClassWithWriteOnlyProperty é um tipo com propriedade somente gravação. GoodClassWithReadWriteProperty contém o código corrigido.

Imports System

Namespace ca1044

    Public Class BadClassWithWriteOnlyProperty

        Dim someName As String

        ' Violates rule PropertiesShouldNotBeWriteOnly.
        WriteOnly Property Name As String
            Set
                someName = Value
            End Set
        End Property

    End Class

    Public Class GoodClassWithReadWriteProperty

        Property Name As String

    End Class

End Namespace
public class BadClassWithWriteOnlyProperty
{
    string? _someName;

    // Violates rule PropertiesShouldNotBeWriteOnly.
    public string? Name
    {
        set
        {
            _someName = value;
        }
    }
}

public class GoodClassWithReadWriteProperty
{
    public string? Name { get; set; }
}