Partilhar via


CA1018: Marcar atributos com AttributeUsageAttribute

Property valor
ID da regra CA1018
Título Marcar atributos com AttributeUsageAttribute
Categoria Desenho
A correção está quebrando ou não quebrando Quebrando
Habilitado por padrão no .NET 8 Como sugestão

Motivo

O System.AttributeUsageAttribute atributo não está presente no atributo personalizado.

Descrição da regra

Ao definir um atributo personalizado, marque-o usando AttributeUsageAttribute para indicar onde no código-fonte o atributo personalizado pode ser aplicado. O significado e o uso pretendido de um atributo determinarão seus locais válidos no código. Por exemplo, você pode definir um atributo que identifique a pessoa responsável por manter e aprimorar cada tipo em uma biblioteca, e essa responsabilidade é sempre atribuída no nível do tipo. Nesse caso, os compiladores devem habilitar o atributo em classes, enumerações e interfaces, mas não devem habilitá-lo em métodos, eventos ou propriedades. Políticas e procedimentos organizacionais ditariam se o atributo deve ser habilitado em assemblies.

A System.AttributeTargets enumeração define os destinos que você pode especificar para um atributo personalizado. Se você omitir AttributeUsageAttribute, seu atributo personalizado será válido para todos os destinos, conforme definido pelo All valor da AttributeTargets enumeração.

Como corrigir violações

Para corrigir uma violação dessa regra, especifique destinos para o atributo usando AttributeUsageAttribute. Veja o seguinte exemplo.

Quando suprimir avisos

Você deve corrigir uma violação dessa regra em vez de excluir a mensagem. Mesmo que o atributo herde , o atributo deve estar presente para simplificar a manutenção do AttributeUsageAttributecódigo.

Exemplo

O exemplo a seguir define dois atributos. BadCodeMaintainerAttribute omite incorretamente a AttributeUsageAttribute instrução e GoodCodeMaintainerAttribute implementa corretamente o atributo descrito anteriormente nesta seção. (A propriedade DeveloperName é exigida pela regra de design CA1019: Definir acessadores para argumentos de atributo e é incluída para integridade.)

using System;

namespace ca1018
{
    // Violates rule: MarkAttributesWithAttributeUsage.
    public sealed class BadCodeMaintainerAttribute : Attribute
    {
        public BadCodeMaintainerAttribute(string developerName)
        {
            DeveloperName = developerName;
        }
        public string DeveloperName { get; }
    }

    // Satisfies rule: Attributes specify AttributeUsage.
    // This attribute is valid for type-level targets.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
    public sealed class GoodCodeMaintainerAttribute : Attribute
    {
        public GoodCodeMaintainerAttribute(string developerName)
        {
            DeveloperName = developerName;
        }
        public string DeveloperName { get; }
    }
}
Imports System

Namespace ca1018

    ' Violates rule: MarkAttributesWithAttributeUsage.
    Public NotInheritable Class BadCodeMaintainerAttribute
        Inherits Attribute

        Public Sub New(developerName As String)
            Me.DeveloperName = developerName
        End Sub 'New

        Public ReadOnly Property DeveloperName() As String
    End Class

    ' Satisfies rule: Attributes specify AttributeUsage.
    ' The attribute is valid for type-level targets.
    <AttributeUsage(AttributeTargets.Class Or AttributeTargets.Enum Or
   AttributeTargets.Interface Or AttributeTargets.Delegate)>
    Public NotInheritable Class GoodCodeMaintainerAttribute
        Inherits Attribute

        Public Sub New(developerName As String)
            Me.DeveloperName = developerName
        End Sub 'New

        Public ReadOnly Property DeveloperName() As String
    End Class

End Namespace

Consulte também