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