Partager via


Marquer les attributs avec AttributeUsageAttribute

Mise à jour : novembre 2007

TypeName

MarkAttributesWithAttributeUsage

CheckId

CA1018

Catégorie

Microsoft.CSharp

Modification avec rupture

Oui

Cause

L'attribut System.AttributeUsageAttribute n'est pas présent sur l'attribut personnalisé.

Description de la règle

Lorsque vous définissez un attribut personnalisé, marquez-le à l'aide de AttributeUsageAttribute pour indiquer où l'attribut personnalisé peut être appliqué dans le code source. La signification et l'utilisation prévue d'un attribut déterminent ses emplacements valides au sein d'un code. Par exemple, si vous définissez un attribut qui identifie la personne responsable de la maintenance et de l'amélioration de chacun des types d'une bibliothèque, et si la responsabilité est systématiquement assignée au niveau type, les compilateurs doivent autoriser l'attribut sur les classes, les énumérations et les interfaces, mais ne doivent pas l'autoriser sur les méthodes, les événements ou les propriétés. Les stratégies d'organisation et les procédures dicteraient si l'attribut doit être ou non autorisé sur des assemblys.

L'énumération System.AttributeTargets définit les cibles que vous pouvez spécifier pour un attribut personnalisé. Si vous omettez AttributeUsageAttribute, votre attribut personnalisé sera valide pour toutes les cibles, conformément à la définition de All

Comment corriger les violations

Pour corriger une violation de cette règle, spécifiez des cibles pour l'attribut à l'aide de AttributeUsageAttribute. Voir l'exemple suivant.

Quand supprimer les avertissements

Vous devez corriger une violation de cette règle au lieu d'exclure le message. Même si l'attribut hérite de AttributeUsageAttribute, il doit être présent pour simplifier la maintenance du code.

Exemple

L'exemple suivant définit deux attributs. BadCodeMaintainerAttribute omet l'instruction AttributeUsageAttribute à mauvais escient, tandis que GoodCodeMaintainerAttribute implémente correctement l'attribut décrit ci-dessus. Remarquez que la propriété DeveloperName est requise par la règle de design Définir des accesseurs pour les arguments d'attribut et est intégrée à des fins d'exhaustivité.

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

Règles connexes

Définir des accesseurs pour les arguments d'attribut

Évitez les attributs non scellés

Voir aussi

Référence

Indications concernant l'utilisation des attributs

System.AttributeTargets