CA1018 : Marquer les attributs avec AttributeUsageAttribute
Propriété | Value |
---|---|
Identificateur de la règle | CA1018 |
Titre | Marquer les attributs avec AttributeUsageAttribute |
Catégorie | Conception |
Le correctif est cassant ou non cassant | Rupture |
Activé par défaut dans .NET 8 | À titre de suggestion |
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 d’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 responsable de la maintenance et de l’amélioration de chaque type dans une bibliothèque, et cette responsabilité est toujours attribuée au niveau du type. Dans ce cas, les compilateurs doivent activer l’attribut sur les classes, les énumérations et les interfaces, mais pas sur les méthodes, les événements ou les propriétés. Les stratégies et procédures organisationnelles déterminent si l’attribut doit être activé sur les assemblies.
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
d’énumération AttributeTargets.
Comment corriger les violations
Pour corriger une violation de cette règle, spécifiez des cibles pour l’attribut à l’aide d’AttributeUsageAttribute. Lisez 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 d’AttributeUsageAttribute, l’attribut doit être présent pour simplifier la maintenance du code.
Exemple
L’exemple suivant définit deux attributs. BadCodeMaintainerAttribute
omet incorrectement l’instruction AttributeUsageAttribute, et GoodCodeMaintainerAttribute
implémente correctement l’attribut décrit précédemment dans cette section. (La propriété DeveloperName
est requise par la règle de conception CA1019 : Définir les accesseurs pour les arguments d’attribut et est incluse pour l’exhaustivité.)
using System;
namespace ca1018
{
// Violates rule: MarkAttributesWithAttributeUsage.
public sealed class BadCodeMaintainerAttribute : Attribute
{
public BadCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
// Satisfies rule: Attributes specify AttributeUsage.
// This attribute is valid for type-level targets.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Enum | AttributeTargets.Interface | AttributeTargets.Delegate)]
public sealed class GoodCodeMaintainerAttribute : Attribute
{
public GoodCodeMaintainerAttribute(string developerName)
{
DeveloperName = developerName;
}
public string DeveloperName { get; }
}
}
Imports System
Namespace ca1018
' Violates rule: MarkAttributesWithAttributeUsage.
Public NotInheritable Class BadCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
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)>
Public NotInheritable Class GoodCodeMaintainerAttribute
Inherits Attribute
Public Sub New(developerName As String)
Me.DeveloperName = developerName
End Sub 'New
Public ReadOnly Property DeveloperName() As String
End Class
End Namespace
Règles associées
- CA1019 : Définissez des accesseurs pour les arguments d’attribut
- CA1813 : Évitez les attributs unsealed