CA1018: Contrassegnare gli attributi con AttributeUsageAttribute

Proprietà valore
ID regola CA1018
Title Contrassegnare gli attributi con AttributeUsageAttribute
Categoria Progettazione
Correzione che causa un'interruzione o un'interruzione Interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

L'attributo System.AttributeUsageAttribute non è presente nell'attributo personalizzato.

Descrizione regola

Quando si definisce un attributo personalizzato, contrassegnarlo usando AttributeUsageAttribute per indicare dove è possibile applicare l'attributo personalizzato nel codice sorgente. Il significato e l'utilizzo previsto di un attributo ne determinano le posizioni valide nel codice. Ad esempio, è possibile definire un attributo che identifichi la persona responsabile della gestione e del miglioramento di ogni tipo in una libreria e che tale responsabilità venga sempre assegnata a livello di tipo. In questo caso, i compilatori devono abilitare l'attributo su classi, enumerazioni e interfacce, ma non devono abilitarlo su metodi, eventi o proprietà. I criteri e le procedure dell'organizzazione determinano se l'attributo deve essere abilitato negli assembly.

L'enumerazione System.AttributeTargets definisce le destinazioni che è possibile specificare per un attributo personalizzato. Se si omette AttributeUsageAttribute, l'attributo personalizzato sarà valido per tutte le destinazioni, come definito dal valore dell'enumerazione AllAttributeTargets .

Come correggere le violazioni

Per correggere una violazione di questa regola, specificare le destinazioni per l'attributo tramite AttributeUsageAttribute. Vedi l'esempio seguente.

Quando eliminare gli avvisi

È consigliabile correggere una violazione di questa regola anziché escludere il messaggio. Anche se l'attributo eredita AttributeUsageAttribute, l'attributo deve essere presente per semplificare la manutenzione del codice.

Esempio

Nell'esempio seguente vengono definiti due attributi. BadCodeMaintainerAttribute omette erroneamente l'istruzione AttributeUsageAttribute e GoodCodeMaintainerAttribute implementa correttamente l'attributo descritto in precedenza in questa sezione. La proprietà DeveloperName è richiesta dalla regola di progettazione CA1019: definire le funzioni di accesso per gli argomenti degli attributi ed è inclusa per completezza.

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

Vedi anche