Condividi tramite


CA1019: Definire le funzioni di accesso per gli argomenti degli attributi

TypeName

DefineAccessorsForAttributeArguments

CheckId

CA1019

Category

Microsoft.Design

Breaking Change

Non sostanziale

Causa

Un attributo definisce nel proprio costruttore argomenti che non dispongono di proprietà corrispondenti.

Descrizione della regola

Gli attributi possono definire argomenti obbligatori che devono essere specificati quando si applica l'attributo a una destinazione.Sono inoltre noti come argomenti posizionali poiché vengono forniti ai costruttori di attributo come parametri posizionali.Per ogni argomento obbligatorio, l'attributo deve fornire anche una proprietà in sola lettura corrispondente in modo che il valore dell'argomento possa essere recuperato in fase di esecuzione.Mediante questa regola viene verificato che per ogni parametro del costruttore sia stata definita la proprietà corrispondente.

Gli attributi possono inoltre definire argomenti facoltativi, noti anche come argomenti denominati.Questi argomenti sono forniti ai costruttori degli attributi in base al nome e devono disporre di una proprietà in lettura e scrittura corrispondente.

Per gli argomenti obbligatori e facoltativi, le proprietà corrispondenti e i parametri dei costruttori devono utilizzare lo stesso nome, ma convenzioni diverse relativamente all'uso di maiuscole e minuscole.Le proprietà utilizzano la convenzione Pascal, i parametri la convenzione Camel.

Come correggere le violazioni

Per correggere una violazione di questa regola, aggiungere una proprietà in sola lettura per ogni parametro di costruttore che ne è privo.

Esclusione di avvisi

Eliminare un avviso da questa regola se non si desidera che il valore dell'argomento obbligatorio possa essere recuperato.

Esempio di attributi personalizzati

Descrizione

Nell'esempio riportato di seguito vengono illustrati due attributi che definiscono un parametro obbligatorio (posizionale).La prima implementazione dell'attributo non è definita correttamente,mentre la seconda è corretta.

Codice

Imports System

Namespace DesignLibrary

' Violates rule: DefineAccessorsForAttributeArguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class BadCustomAttribute
    Inherits Attribute
    Private data As String 

    ' Missing the property that corresponds to  
    ' the someStringData parameter. 
    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New 
End Class 'BadCustomAttribute

' Satisfies rule: Attributes should have accessors for all arguments.
<AttributeUsage(AttributeTargets.All)>  _
NotInheritable Public Class GoodCustomAttribute
    Inherits Attribute
    Private data As String 

    Public Sub New(someStringData As String)
        data = someStringData
    End Sub 'New 

    'The constructor parameter and property 
    'name are the same except for case. 

    Public ReadOnly Property SomeStringData() As String 
        Get 
            Return data
        End Get 
    End Property 
End Class  

End Namespace
using System;

namespace DesignLibrary
{
// Violates rule: DefineAccessorsForAttributeArguments.

   [AttributeUsage(AttributeTargets.All)]
   public sealed class BadCustomAttribute :Attribute 
   {
      string data;

      // Missing the property that corresponds to  
      // the someStringData parameter. 

      public BadCustomAttribute(string someStringData)
      {
         data = someStringData;
      }
   }

// Satisfies rule: Attributes should have accessors for all arguments.

   [AttributeUsage(AttributeTargets.All)]
   public sealed class GoodCustomAttribute :Attribute 
   {
      string data;

      public GoodCustomAttribute(string someStringData)
      {
         data = someStringData;
      }
      //The constructor parameter and property 
      //name are the same except for case. 

      public string SomeStringData
      {
         get 
         {
            return data;
         }
      }
   }
}

Argomenti posizionali e denominati

Descrizione

Gli argomenti posizionali e denominati rendono più chiaro agli utenti della libreria quali sono gli argomenti obbligatori per l'attributo e quali sono facoltativi.

Nell'esempio seguente viene mostrata l'implementazione di un attributo che presenta argomenti sia posizionali che denominati.

Codice

using System; 

namespace DesignLibrary
{    
    [AttributeUsage(AttributeTargets.All)]        
    public sealed class GoodCustomAttribute : Attribute    
    {        
        string mandatory;        
        string optional;         

        public GoodCustomAttribute(string mandatoryData)        
        {            
            mandatory = mandatoryData;        
        }         

        public string MandatoryData        
        {            
            get { return mandatory; }        
        }         

        public string OptionalData        
        {            
            get { return optional; }            
            set { optional = value; }        
        }    
    }
}

Commenti

Nell'esempio riportato di seguito viene illustrato come applicare l'attributo personalizzato a due proprietà.

Codice

[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string MyProperty
{
    get { return myProperty; }
    set { myProperty = value; }
}

[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string MyOtherProperty
{
    get { return myOtherProperty; }
    set { myOtherProperty = value; }
}

Regole correlate

CA1813: Evitare attributi non sealed

Vedere anche

Altre risorse

Attribute Usage Guidelines