Condividi tramite


CA2245: Non assegnare una proprietà a se stessa

Proprietà valore
ID regola CA2245
Title Non assegnare una proprietà a se stessa
Categoria Utilizzo
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 Come suggerimento

Causa

Una proprietà è stata assegnata accidentalmente a se stessa.

Descrizione regola

Il compilatore C# genera un avviso CS1717: assegnazione eseguita alla stessa variabile. Si intendeva assegnare qualcos'altro? quando un campo, un simbolo di parametro o locale viene assegnato a se stesso. Un errore di questo tipo è comune quando un simbolo locale, parametro o campo ha un nome simile a un altro simbolo nell'ambito. Invece di usare simboli diversi sul lato sinistro e destro dell'assegnazione, lo stesso simbolo è stato usato su entrambi i lati. Ciò comporta un'assegnazione ridondante del valore a se stesso e in genere indica un bug funzionale.

L'assegnazione di una proprietà a se stessa è anche un bug funzionale simile per quasi tutti i casi reali. Tuttavia, in alcuni casi estremi, il recupero di un valore della proprietà può avere effetti collaterali e il nuovo valore della proprietà è diverso dal valore originale. In tal caso, l'assegnazione automatica della proprietà non è ridondante e non può essere rimossa. Ciò impedisce al compilatore di generare un CS1717 avviso per l'assegnazione automatica delle proprietà, senza introdurre una modifica che causa un'interruzione per questi casi.

La regola CA2245 mira a colmare questo divario. Segnala la violazione per l'assegnazione automatica delle proprietà per risolvere questi bug funzionali. Per il piccolo set di casi di angolo in cui l'assegnazione automatica delle proprietà è auspicabile, CA2245 le violazioni possono essere eliminate nell'origine con un commento di giustificazione appropriato.

Come correggere le violazioni

Per correggere le violazioni, utilizzare simboli diversi a sinistra e sul lato destro dell'assegnazione. Ad esempio, il frammento di codice seguente mostra una violazione della regola e come risolverlo:

public class C
{
    private int p = 0;
    public int P { get; private set; }

    public void M(int p)
    {
        // CS1717: Accidentally assigned the parameter 'p' to itself.
        p = p;

        // CA2245: Accidentally assigned the property 'P' to itself.
        P = P;
    }
}
public class C
{
    private int p = 0;
    public int P { get; private set; }

    public void M(int p)
    {
        // No violation, now the parameter is assigned to the field.
        this.p = p;

        // No violation, now the parameter is assigned to the property.
        P = p;
    }
}

Quando eliminare gli avvisi

È sicuro eliminare le violazioni da questa regola se il recupero di un valore della proprietà può avere effetti collaterali e il nuovo valore della proprietà è diverso dal valore originale. In tal caso, l'assegnazione automatica delle proprietà non è ridondante. È necessario aggiungere un commento di giustificazione all'eliminazione per documentare il comportamento previsto.

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

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

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

Vedi anche