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