Partilhar via


CA1019: Definir acessadores para argumentos de atributo

Propriedade valor
ID da regra CA1019
Cargo Definir acessadores para argumentos de atributo
Categoria Desenho
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 8 Não

Causa

Em seu construtor, um atributo define argumentos que não têm propriedades correspondentes.

Descrição da regra

Os atributos podem definir argumentos obrigatórios que devem ser especificados quando você aplica o atributo a um destino. Estes também são conhecidos como argumentos posicionais porque são fornecidos para atribuir construtores como parâmetros posicionais. Para cada argumento obrigatório, o atributo também deve fornecer uma propriedade somente leitura correspondente para que o valor do argumento possa ser recuperado no momento da execução. Esta regra verifica se para cada parâmetro do construtor, você definiu a propriedade correspondente.

Os atributos também podem definir argumentos opcionais, que também são conhecidos como argumentos nomeados. Esses argumentos são fornecidos aos construtores de atributos pelo nome e devem ter uma propriedade de leitura/gravação correspondente.

Para argumentos obrigatórios e opcionais, as propriedades correspondentes e os parâmetros do construtor devem usar o mesmo nome, mas invólucros diferentes. As propriedades usam invólucro Pascal e os parâmetros usam invólucro camelo.

Como corrigir violações

Para corrigir uma violação dessa regra, adicione uma propriedade somente leitura para cada parâmetro do construtor que não tenha um.

Quando suprimir avisos

Suprima um aviso dessa regra se não quiser que o valor do argumento obrigatório seja recuperável.

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

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

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

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

Exemplos

Atributos personalizados

O exemplo a seguir mostra dois atributos que definem um parâmetro obrigatório (posicional). A primeira implementação do atributo está definida incorretamente. A segunda implementação está correta.

// Violates rule: DefineAccessorsForAttributeArguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class BadCustomAttribute : Attribute
{
    string _data;

    // Missing the property that corresponds to 
    // the someStringData constructor parameter.

    public BadCustomAttribute(string someStringData)
    {
        _data = someStringData;
    }
}

// Satisfies rule: Attributes should have accessors for all arguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
    public GoodCustomAttribute(string someStringData)
    {
        SomeStringData = someStringData;
    }

    //The constructor parameter and property
    //name are the same except for case.

    public string SomeStringData { get; }
}
Imports System

Namespace ca1019

    ' Violates rule: DefineAccessorsForAttributeArguments.
    <AttributeUsage(AttributeTargets.All)>
    Public NotInheritable Class BadCustomAttribute
        Inherits Attribute
        Private data As String

        ' Missing the property that corresponds to 
        ' the someStringData parameter.
        Public Sub New(someStringData As String)
            data = someStringData
        End Sub 'New
    End Class 'BadCustomAttribute

    ' Satisfies rule: Attributes should have accessors for all arguments.
    <AttributeUsage(AttributeTargets.All)>
    Public NotInheritable Class GoodCustomAttribute
        Inherits Attribute

        Public Sub New(someStringData As String)
            Me.SomeStringData = someStringData
        End Sub 'New

        'The constructor parameter and property
        'name are the same except for case.

        Public ReadOnly Property SomeStringData() As String
    End Class

End Namespace

Argumentos posicionais e nomeados

Argumentos posicionais e nomeados deixam claro para os consumidores de sua biblioteca quais argumentos são obrigatórios para o atributo e quais argumentos são opcionais.

O exemplo a seguir mostra uma implementação de um atributo que tem argumentos posicionais e nomeados:

[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
    public GoodCustomAttribute(string mandatoryData)
    {
        MandatoryData = mandatoryData;
    }

    public string MandatoryData { get; }

    public string? OptionalData { get; set; }
}

O exemplo a seguir mostra como aplicar o atributo custom a duas propriedades:

[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string? MyProperty { get; set; }

[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }

CA1813: Evite atributos não selados

Consulte também