CA1018: Contrassegnare gli attributi con AttributeUsageAttribute
Proprietà | valore |
---|---|
ID regola | CA1018 |
Title | Contrassegnare gli attributi con AttributeUsageAttribute |
Categoria | Progettazione |
La correzione causa un'interruzione o meno | Interruzione |
Abilitato per impostazione predefinita in .NET 9 | 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 All
AttributeTargets .
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
Regole correlate
- CA1019: Definire le funzioni di accesso per gli argomenti degli attributi
- CA1813: Evitare attributi non sealed