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
Oggetto di 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
Oggetto di 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