Partage via


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

Voir aussi