CA1018 : Marquer les attributs avec AttributeUsageAttributeCA1018: Mark attributes with AttributeUsageAttribute

TypeNameTypeName MarkAttributesWithAttributeUsageMarkAttributesWithAttributeUsage
CheckIdCheckId CA1018CA1018
CategoryCategory Microsoft.DesignMicrosoft.Design
Modification avec ruptureBreaking Change RuptureBreaking

CauseCause

Le System.AttributeUsageAttribute attribut n’est pas présent sur l’attribut personnalisé.The System.AttributeUsageAttribute attribute is not present on the custom attribute.

Description de la règleRule description

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.When you define a custom attribute, mark it by using AttributeUsageAttribute to indicate where in the source code the custom attribute can be applied. La signification et l'utilisation prévue d'un attribut déterminent ses emplacements valides au sein d'un code.The meaning and intended usage of an attribute will determine its valid locations in code. Par exemple, vous pouvez définir un attribut qui identifie la personne qui est responsable de la gestion et l’amélioration de chaque type dans une bibliothèque, et que la responsabilité est toujours affectée au niveau du type.For example, you might define an attribute that identifies the person who is responsible for maintaining and enhancing each type in a library, and that responsibility is always assigned at the type level. Dans ce cas, les compilateurs doivent activer l’attribut sur les classes, énumérations et interfaces, mais ne devraient pas l’activer sur les méthodes, événements ou propriétés.In this case, compilers should enable the attribute on classes, enumerations, and interfaces, but should not enable it on methods, events, or properties. Les stratégies d’organisation et les procédures seraient déterminent si l’attribut doit être activé sur les assemblys.Organizational policies and procedures would dictate whether the attribute should be enabled on assemblies.

Le System.AttributeTargets énumération définit les cibles que vous pouvez spécifier pour un attribut personnalisé.The System.AttributeTargets enumeration defines the targets that you can specify for a custom attribute. Si vous omettez AttributeUsageAttribute, votre attribut personnalisé sera valide pour toutes les cibles, tel que défini par le All valeur AttributeTargets énumération.If you omit AttributeUsageAttribute, your custom attribute will be valid for all targets, as defined by the All value of AttributeTargets enumeration.

Comment corriger les violationsHow to fix violations

Pour corriger une violation de cette règle, spécifiez des cibles pour l’attribut à l’aide de AttributeUsageAttribute.To fix a violation of this rule, specify targets for the attribute by using AttributeUsageAttribute. Lisez l'exemple suivant.See the following example.

Quand supprimer les avertissementsWhen to suppress warnings

Vous devez corriger une violation de cette règle au lieu d’exclure le message.You should fix a violation of this rule instead of excluding the message. Même si l’attribut hérite AttributeUsageAttribute, l’attribut doit être présent pour simplifier la maintenance du code.Even if the attribute inherits AttributeUsageAttribute, the attribute should be present to simplify code maintenance.

ExempleExample

L’exemple suivant définit deux attributs.The following example defines two attributes. BadCodeMaintainerAttribute omet le AttributeUsageAttribute instruction, et GoodCodeMaintainerAttribute implémente correctement l’attribut qui est décrite plus haut dans cette section.BadCodeMaintainerAttribute incorrectly omits the AttributeUsageAttribute statement, and GoodCodeMaintainerAttribute correctly implements the attribute that is described earlier in this section. Notez que la propriété DeveloperName est requis par la règle de conception CA1019 : définir des accesseurs pour les arguments d’attribut et est incluse par souci d’exhaustivité.Note that the property DeveloperName is required by the design rule CA1019: Define accessors for attribute arguments and is included for completeness.

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

CA1019 : Définissez des accesseurs pour les arguments d’attributCA1019: Define accessors for attribute arguments

CA1813 : Évitez les attributs unsealedCA1813: Avoid unsealed attributes

Voir aussiSee also