Compartilhar via


CA1018: marcar atributos com AttributeUsageAttribute

TypeName

MarkAttributesWithAttributeUsage

CheckId

CA1018

Categoria

Microsoft.Design

Alteração Significativa

Quebra

Causa

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

Descrição da Regra

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

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

Como Corrigir Violações

Para corrigir uma violação desta regra, especifique destinos para o atributo usando AttributeUsageAttribute.Consulte o exemplo a seguir.

Quando Suprimir Alertas

Você deve corrigir uma violação desta regra em vez de excluir a mensagem.Se o atributo herda AttributeUsageAttribute, o atributo deve estar presente para simplificar a manutenção do código.

Exemplo

O exemplo a seguir define dois atributos.BadCodeMaintainerAttribute omitir incorretamente a instrução de AttributeUsageAttribute , e GoodCodeMaintainerAttribute implementa corretamente o atributo que é descrito anteriormente nesta seção.Observe que a propriedade DeveloperName é exigida pela regra CA1019: definir acessadores para argumentos de atributo de design e é incluída para manter a integridade.

Imports System

Namespace DesignLibrary

' Violates rule: MarkAttributesWithAttributeUsage. 
NotInheritable Public Class BadCodeMaintainerAttribute
    Inherits Attribute
    Private developer As String 

    Public Sub New(developerName As String)
        developer = developerName
    End Sub 'New 

    Public ReadOnly Property DeveloperName() As String 
        Get 
            Return developer
        End Get 
    End Property 
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)> _
NotInheritable Public Class GoodCodeMaintainerAttribute
    Inherits Attribute
    Private developer As String 

    Public Sub New(developerName As String)
        developer = developerName
    End Sub 'New 

    Public ReadOnly Property DeveloperName() As String 
        Get 
            Return developer
        End Get 
    End Property 
End Class  

End Namespace
using System;

namespace DesignLibrary
{
// Violates rule: MarkAttributesWithAttributeUsage. 

   public sealed class BadCodeMaintainerAttribute :Attribute 
   {
      string developer;

      public BadCodeMaintainerAttribute(string developerName)
      {
         developer = developerName;
      }
      public string DeveloperName
      {
         get 
         {
            return developer;
         }
      }
   }
// Satisfies rule: Attributes specify AttributeUsage. 

   // The attribute is valid for type-level targets.
   [AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
   public sealed class GoodCodeMaintainerAttribute :Attribute 
   {
      string developer;

      public GoodCodeMaintainerAttribute(string developerName)
      {
         developer = developerName;
      }
      public string DeveloperName
      {
         get 
         {
            return developer;
         }
      }
   }
}

Regras Relacionadas

CA1019: definir acessadores para argumentos de atributo

CA1813: evitar atributos não lacrados

Consulte também

Outros recursos

Attribute Usage Guidelines