CA2011: Non assegnare la proprietà all'interno del setter

Proprietà valore
ID regola CA2011
Title Non assegnare la proprietà all'interno del relativo setter
Categoria Affidabilità
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

A una proprietà è stato assegnato accidentalmente un valore all'interno della propria funzione di accesso set.

Descrizione regola

L'assegnazione di una proprietà a se stessa nella funzione di accesso set comporta una catena infinita di chiamate ricorsive alla funzione di accesso set. In questo modo viene restituito un oggetto StackOverflowException in fase di esecuzione. Un errore di questo tipo è comune quando la proprietà e il campo sottostante per archiviare il valore della proprietà hanno nomi simili. Anziché assegnare il valore al campo sottostante, è stato assegnato accidentalmente alla proprietà stessa.

Come correggere le violazioni

Per correggere le violazioni, sostituire l'assegnazione violante alla proprietà con un'assegnazione al campo sottostante o passare all'uso di una proprietà automatica. Ad esempio, il frammento di codice seguente mostra una violazione della regola e un paio di modi per risolverlo:

public class C
{
    // Backing field for property 'P'
    private int p;

    public int P
    {
        get
        {
            return p;
        }
        set
        {
            // CA2011: Accidentally assigned to property, instead of the backing field.
            P = value;
        }
    }
}
public class C
{
    // Backing field for property 'P'
    private int _p;

    public int P
    {
        get
        {
            return _p;
        }
        set
        {
            // Option 1: Assign to backing field and rename the backing field for clarity.
            _p = value;
        }
    }
}
public class C
{
    // Option 2: Use auto-property.
    public int P { get; set; }
}

Quando eliminare gli avvisi

È consigliabile eliminare le violazioni da questa regola se si è certi che le chiamate ricorsive alla funzione di accesso set siano sorvegliate in modo condizionale per impedire la ricorsione infinita.

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 CA2011
// The code that's violating the rule is on this line.
#pragma warning restore CA2011

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.CA2011.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Vedi anche