CA1018: Atributos de marca com AttributeUsageAttribute

TypeName

MarkAttributesWithAttributeUsage

CheckId

CA1018

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Quebrando

Causa

O System.AttributeUsageAttribute atributo não estiver presente no atributo personalizado.

Descrição da regra

Quando você define um atributo personalizado, marcá-la usando AttributeUsageAttribute para indicar onde o código-fonte do atributo personalizado pode ser aplicado. O que significa e pretendido o uso de um atributo determinará seus locais válidos no código. Por exemplo, você pode definir um atributo que identifica a pessoa a quem é responsável por manter e aprimorar a cada tipo de uma biblioteca e responsabilidade é sempre atribuída no nível do tipo. Nesse caso, compiladores devem ativar o atributo em classes, enumerações e interfaces, mas não devem ativá-lo em métodos, eventos ou propriedades. Procedimentos e diretivas organizacionais determinaria se o atributo deve ser ativado em assemblies.

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

Como corrigir violações

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

Quando suprimir avisos

Você deve corrigir uma violação desta regra em vez de excluir a mensagem. Mesmo 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. BadCodeMaintainerAttributeOmite incorretamente a AttributeUsageAttribute de instrução, e GoodCodeMaintainerAttribute corretamente implementa o atributo que é descrito anteriormente nesta seção. Observe que a propriedade DeveloperName é necessária para a regra de design CA1019: Definir acessadores para argumentos de atributo e é incluída para completude.

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: Evite atributos sem lacre

Consulte também

Referência

Diretrizes de uso do atributo