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à |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | 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.