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; }
Regras conexas
CA1813: Evite atributos não selados