Condividi tramite


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

Evitare attributi non sealed

Vedere anche

Riferimenti

Linee guida per l'utilizzo degli attributi

System.AttributeTargets