Contrassegnare gli attributi con AttributeUsageAttribute
Aggiornamento: novembre 2007
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. Se, ad esempio, si definisce un attributo che identifica la persona responsabile della gestione e del miglioramento di ogni tipo di una libreria e la responsabilità è sempre assegnata a livello di tipo, i compilatori devono consentire l'attributo su classi, enumerazioni e interfacce, ma non su metodi, eventi o proprietà. Le procedure e i criteri organizzativi indicano se l'attributo deve essere consentito 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 da All
Correzione di 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 riportato di seguito vengono definiti due attributi. In BadCodeMaintainerAttribute è erroneamente omessa l'istruzione AttributeUsageAttribute, mentre in GoodCodeMaintainerAttribute viene correttamente implementato l'attributo descritto in precedenza. Si noti che la proprietà DeveloperName è richiesta dalla regola di progettazione 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
Definire le funzioni di accesso per gli argomenti degli attributi