Partilhar via


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 por meio de AttributeUsageAttribute para indicar onde o código-fonte no 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 de quem é responsável por manter e aprimorar a cada tipo em uma biblioteca e responsabilidade é sempre atribuída no nível do tipo.Nesse caso, compiladores devem ativar o atributo em classes, interfaces e enumerações, 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 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 instrução, e GoodCodeMaintainerAttribute corretamente implementa o atributo descrita anteriormente nesta seção.Observe que a propriedade DeveloperName é necessária para a regra de criação CA1019: Definir acessadores para argumentos de atributo e foram incluídas 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

CA1019: Definir acessadores para argumentos de atributo

CA1813: Evite atributos sem lacre

Consulte também

Referência

Attribute Usage Guidelines