CA1018: Contrassegnare gli attributi con AttributeUsageAttribute
TypeName |
MarkAttributesWithAttributeUsage |
CheckId |
CA1018 |
Category |
Microsoft.Design |
Breaking Change |
Breaking |
Causa
L'attributo System.AttributeUsageAttribute non è presente sull'attributo personalizzato.
Descrizione della regola
Quando si definisce un attributo personalizzato, contrassegnarlo mediante AttributeUsageAttribute per indicare la posizione nel codice sorgente in cui può essere applicato l'attributo personalizzato.Il significato e l'utilizzo previsto di un attributo ne determinano le posizioni valide nel codice.Ad esempio, è possibile definire un attributo che identifica la persona responsabile della gestione e del miglioramento di ogni tipo in una libreria e tale responsabilità è sempre assegnata a livello di tipo.In questo caso, è necessario che i compilatori abilitino l'attributo in classi, enumerazioni e interfacce, ma non in metodi, eventi o proprietà.Le procedure e i criteri organizzativi indicano se l'attributo deve essere abilitato sugli 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 All dell'enumerazione AttributeTargets.
Come correggere le violazioni
Per correggere una violazione di questa regola, specificare le destinazioni per l'attributo mediante AttributeUsageAttribute.Vedere l'esempio che segue.
Esclusione di avvisi
È consigliabile correggere la violazione di questa regola anziché escludere il messaggio.Anche se l'attributo eredita AttributeUsageAttribute, l'attributo deve essere presente per semplificare la gestione del codice.
Esempio
Nell'esempio seguente vengono definiti due attributi.In BadCodeMaintainerAttribute è erroneamente omessa l'istruzione AttributeUsageAttribute e in GoodCodeMaintainerAttribute viene correttamente implementato l'attributo descritto in precedenza in questa sezione.Si noti che la proprietà DeveloperName è richiesta dalla regola di progettazione CA1019: Definire le funzioni di accesso per gli argomenti degli attributi ed è inclusa per completezza.
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;
}
}
}
}
Regole correlate
CA1019: Definire le funzioni di accesso per gli argomenti degli attributi
CA1813: Evitare attributi non sealed