CA1018 : Marquer les attributs avec AttributeUsageAttribute

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, vous pouvez définir un attribut qui identifie la personne qui est responsable de la maintenance et de l'amélioration de chaque type dans une bibliothèque, et cette responsabilité est toujours assignée au niveau du type. Dans ce cas, les compilateurs doivent activer l'attribut sur des classes, des énumérations et des interfaces, mais ne doivent pas l'activer sur des méthodes, des événements ou des propriétés. Les stratégies d'organisation et les procédures dicteraient si l'attribut doit être ou non activé 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, comme défini par la valeur All de l'énumération de AttributeTargets.

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 à suivre définit deux attributs. BadCodeMaintainerAttribute ignore de manière incorrecte l'instruction AttributeUsageAttribute et GoodCodeMaintainerAttribute implémente de manière correcte l'attribut décrit précédemment dans cette section. Remarquez que la propriété DeveloperName est requise par la règle de design CA1019 : 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

CA1019 : Définir des accesseurs pour les arguments d'attribut

CA1813 : Évitez les attributs unsealed

Voir aussi

Référence

Indications concernant l'utilisation des attributs