Compartir a través de


CA1018: Marcar atributos con AttributeUsageAttribute

Nombre de tipo

MarkAttributesWithAttributeUsage

Identificador de comprobación

CA1018

Categoría

Microsoft.Design

Cambio problemático

Motivo

El atributo System.AttributeUsageAttribute no está presente en el atributo personalizado.

Descripción de la regla

Cuando define un atributo personalizado, márquelo utilizando AttributeUsageAttribute para indicar donde se puede aplicar el atributo personalizado en el código fuente.El significado de un atributo y el uso que se le va a dar determinará sus ubicaciones válidas en código.Por ejemplo, podría definir un atributo que identifique la persona responsable de mantener y mejorar cada tipo en una biblioteca, y que esa responsabilidad siempre se asigne en el nivel de tipo.En este caso, los compiladores deberían habilitar el atributo en las clases, enumeraciones e interfaces, pero no deberían habilitarlo en los métodos, eventos o propiedades.Las directivas organizativas y los procedimientos dictarían si el atributo debe habilitarse en ensamblados.

La enumeración System.AttributeTargets define los destinos que puede especificar para un atributo personalizado.Si omite AttributeUsageAttribute, su atributo personalizado será válido para todos los destinos, tal y como define el valor All de la enumeración AttributeTargets.

Cómo corregir infracciones

Para corregir una infracción de esta regla, especifique los destinos para el atributo utilizando AttributeUsageAttribute.Vea el ejemplo siguiente.

Cuándo suprimir advertencias

Se debe corregir una infracción de esta regla en lugar de excluir el mensaje.Aun cuando el atributo hereda AttributeUsageAttribute, el atributo debe estar presente para simplificar el mantenimiento del código.

Ejemplo

En el siguiente ejemplo se definen dos atributos.BadCodeMaintainerAttribute omite la instrucción AttributeUsageAttribute incorrectamente y GoodCodeMaintainerAttribute implementa correctamente el atributo que se describe anteriormente en esta sección.Tenga en cuenta que la regla de diseño CA1019: Definir descriptores de acceso para los argumentos de atributo requiere la propiedad DeveloperName y se incluye para obtener un mejor resultado.

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;
         }
      }
   }
}

Reglas relacionadas

CA1019: Definir descriptores de acceso para los argumentos de atributo

CA1813: Evitar atributos no sellados

Vea también

Referencia

Attribute Usage Guidelines