Condividi tramite


Allocazioni booleane boxed

Questo articolo descrive le informazioni dettagliate sulle prestazioni per le allocazioni booleane boxed.

Motivo

Il boxing di valori booleani in .NET crea allocazioni di heap ogni volta che un oggetto bool viene convertito in un object tipo di interfaccia o . Queste allocazioni, anche se di piccole dimensioni, possono accumularsi rapidamente nei percorsi di codice critici per le prestazioni e causare pressioni di Garbage Collection non necessarie, soprattutto quando gli stessi valori booleani vengono ri boxed ripetutamente.

Descrizione delle informazioni dettagliate sulle prestazioni

Quando viene sottoposto a boxing un valore booleano, il runtime alloca un nuovo oggetto nell'heap per eseguire il wrapping del tipo di valore. Poiché esistono solo due valori booleani possibili (true e false), la conversione ripetuta di questi valori è sprecato. Invece di consentire il boxing implicito, è più efficiente memorizzare nella cache le istanze boxed e riutilizzarle. È possibile creare campi di sola lettura statici per i valori boxed true e false e restituire l'istanza memorizzata nella cache appropriata quando è necessario boxing.

Come analizzare un avviso

Fare clic sul collegamento Analizza per passare alla visualizzazione Allocazione che mostra gli oggetti booleani boxed allocati. Facendo doppio clic sull'allocazione vengono visualizzati i percorsi di codice in cui si verificano le allocazioni. Valutare la possibilità di ridurre queste allocazioni memorizzando nella cache i valori booleani boxed e restituendo le istanze memorizzate nella cache anziché consentire operazioni di boxing ripetute.

Se Copilot è abilitato, viene visualizzato il pulsante Ask Copilot Screenshot del pulsante Ask Copilot. Selezionare il pulsante e Copilot fornisce un'analisi dettagliata dei modelli di allocazione e suggerisce correzioni del codice per ottimizzare l'utilizzo della memoria.

Di seguito è riportato un esempio di allocazione booleana boxed e della relativa risoluzione:

Violazione:

class Example
{
    public object GetResult(bool condition)
    {
        return condition; // Implicit boxing occurs here
    }
}

Risoluzione:

class Example
{
    private static readonly object BoxedTrue = true;
    private static readonly object BoxedFalse = false;

    public object GetResult(bool condition)
    {
        return condition ? BoxedTrue : BoxedFalse;
    }
}

Risorse aggiuntive

Per altre informazioni su come evitare allocazioni boxing e altre procedure consigliate per le prestazioni, vedere le risorse seguenti:

Boxing e unboxing (Guida per programmatori C#)

CA1841: Prefer Dictionary.Contains metodi (analisi del codice)

Seguendo queste linee guida, è possibile assicurarsi che l'applicazione sia ottimizzata per le prestazioni ed evitare un sovraccarico di boxing non necessario.