Condividi tramite


Valutazione di stringhe condizionale nei metodi di debug

È comune usare stringhe interpolate come messaggi di asserzione, ad esempio:

Debug.Assert(result != x, $"Unexpected result {result}");

Nelle versioni precedenti, tuttavia, viene creata una stringa per il messaggio, incluso il risultato della formattazione, in ogni chiamata, anche se la condizione è true. E l'uso tipico per le asserzioni è che si tratta di una condizione che deve essere sempre true.

C# 10 aggiunge il supporto per una migliore interpolazione di stringhe, inclusa la possibilità di impostare come destinazione "gestori" personalizzati oltre alle stringhe. In .NET 6 la classe Debug include nuovi overload di Assert, WriteIf e WriteLineIf che usano questa funzionalità per valutare in modo condizionale gli elementi di formattazione delle stringhe interpolati solo se il messaggio è obbligatorio. Il compilatore C# preferisce questi nuovi overload. Se gli elementi di formattazione modificavano lo stato e il programma si basava su tali mutazioni per essere visibili anche se l'asserzione non veniva attivata, potevi osservare una differenza nel comportamento.

Comportamento precedente

Nel codice seguente r.ToString() viene sempre richiamato.

Debug.Assert(true, $"{r.ToString()}");

Nuovo comportamento

Nel codice seguente r.ToString() non verrà mai richiamato, perché il messaggio è necessario solo se la condizione è false.

Debug.Assert(true, $"{r.ToString()}");

Versione introdotta

6.0 RC 1

Tipo di modifica che causa un'interruzione

Questa modifica può influire sulla compatibilità dell'origine.

Motivo della modifica

Questa modifica è stata introdotta per migliorare le prestazioni.

Le stringhe interpolate usate con i metodi Debug non devono modificare lo stato condiviso. (Questi metodi sono condizionali anche nella costante di compilazione DEBUG.) Se, per qualsiasi motivo, fosse fondamentale mantenere il comportamento precedente, aggiungere un cast (string) prima della stringa interpolata. Questo cast forza il compilatore a eseguire l'associazione all'overload esistente e garantisce che la stringa venga sempre materializzata.

API interessate