CA1019: Definire le funzioni di accesso per gli argomenti degli attributi
Proprietà | valore |
---|---|
ID regola | CA1019 |
Title | Definire le funzioni di accesso per gli argomenti degli attributi |
Categoria | Progettazione |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Nel relativo costruttore, un attributo definisce gli argomenti che non dispongono di proprietà corrispondenti.
Descrizione 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. Questa regola verifica 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à e i parametri del costruttore corrispondenti devono usare lo stesso nome ma maiuscole/minuscole diverse. Le proprietà usano maiuscole e minuscole Pascal e i parametri usano maiuscole e minuscole camel.
Come correggere le violazioni
Per correggere una violazione di questa regola, aggiungere una proprietà di sola lettura per ogni parametro del costruttore che non ne dispone.
Quando eliminare gli avvisi
Eliminare un avviso da questa regola se non si desidera che il valore dell'argomento obbligatorio sia recuperabile.
Eliminare un avviso
Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.
#pragma warning disable CA1019
// The code that's violating the rule is on this line.
#pragma warning restore CA1019
Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none
su nel file di configurazione.
[*.{cs,vb}]
dotnet_diagnostic.CA1019.severity = none
Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.
Esempi
Attributi personalizzati
Nell'esempio seguente vengono illustrati due attributi che definiscono un parametro obbligatorio (posizionale). La prima implementazione dell'attributo è definita in modo non corretto. La seconda implementazione è corretta.
// Violates rule: DefineAccessorsForAttributeArguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class BadCustomAttribute : Attribute
{
string _data;
// Missing the property that corresponds to
// the someStringData constructor parameter.
public BadCustomAttribute(string someStringData)
{
_data = someStringData;
}
}
// Satisfies rule: Attributes should have accessors for all arguments.
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
public GoodCustomAttribute(string someStringData)
{
SomeStringData = someStringData;
}
//The constructor parameter and property
//name are the same except for case.
public string SomeStringData { get; }
}
Imports System
Namespace ca1019
' Violates rule: DefineAccessorsForAttributeArguments.
<AttributeUsage(AttributeTargets.All)>
Public NotInheritable 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)>
Public NotInheritable Class GoodCustomAttribute
Inherits Attribute
Public Sub New(someStringData As String)
Me.SomeStringData = someStringData
End Sub 'New
'The constructor parameter and property
'name are the same except for case.
Public ReadOnly Property SomeStringData() As String
End Class
End Namespace
Argomenti posizionali e denominati
Gli argomenti posizionali e denominati rendono chiaro agli utenti della libreria quali argomenti sono obbligatori per l'attributo e quali argomenti sono facoltativi.
L'esempio seguente mostra un'implementazione di un attributo con argomenti posizionali e denominati:
[AttributeUsage(AttributeTargets.All)]
public sealed class GoodCustomAttribute : Attribute
{
public GoodCustomAttribute(string mandatoryData)
{
MandatoryData = mandatoryData;
}
public string MandatoryData { get; }
public string? OptionalData { get; set; }
}
Nell'esempio seguente viene illustrato come applicare l'attributo personalizzato a due proprietà:
[GoodCustomAttribute("ThisIsSomeMandatoryData", OptionalData = "ThisIsSomeOptionalData")]
public string? MyProperty { get; set; }
[GoodCustomAttribute("ThisIsSomeMoreMandatoryData")]
public string? MyOtherProperty { get; set; }
Regole correlate
CA1813: Evitare attributi non sealed