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

Proprietà valore
ID regola CA1019
Titolo Definire le funzioni di accesso per gli argomenti degli attributi
Categoria Progettazione
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 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; }

CA1813: Evitare attributi non sealed

Vedi anche