Compartilhar via


Atributos de marca com AttributeUsageAttribute

TypeName

MarkAttributesWithAttributeUsage

CheckId

CA1018

Category (Categoria)

Microsoft.Design

Quebrando alterar

Quebrando

Causa

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

Descrição da regra

Ao definir um atributo personalizado, marcá-la usando AttributeUsageAttribute para indicar onde no código-fonte do atributo personalizado pode ser aplicado. Significado de um atributo e o uso pretendido determinará seus locais válido no código.Por exemplo, se você está definindo um atributo que identifica a pessoa responsável pela manutenção e aumentar cada tipo de uma biblioteca e responsabilidade é sempre atribuída no nível de tipo, compiladores devem permitir que o atributo em classes, enumerações e interfaces, mas não devem permitir que ele em métodos, eventos ou propriedades.Procedimentos e diretivas organizacionais seriam determinam se o atributo deve ter permissão em assemblies.

The 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 sistema autônomo destinos, conforme definido pela All

Como corrigir violações

Para corrigir uma violação dessa regra, especificar 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.BadCodeMaintainerAttribute omite incorretamente o AttributeUsageAttribute demonstrativo, enquanto GoodCodeMaintainerAttribute implementa corretamente o atributo descrito acima. Observe que a propriedade DeveloperName é necessário para a regra de criação Definir acessadores para argumentos de atributo e é fornecido como complemento.

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

Definir acessadores para argumentos de atributo

Evite atributos sem lacre

Consulte também

Referência

Diretrizes de uso do atributo

System.AttributeTargets