Condividi tramite


CA1018: Contrassegnare gli attributi con AttributeUsageAttribute

TypeName

MarkAttributesWithAttributeUsage

CheckId

CA1018

Category

Microsoft.Design

Breaking Change

Breaking

Causa

L'attributo 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 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

Vedere anche

Altre risorse

Attribute Usage Guidelines