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 delle asserzioni si riferisce a una condizione che deve essere sempre vera.

C# 10 aggiunge il supporto per un'interpolazione di stringhe migliore, inclusa la possibilità di definire come destinazione "gestori" personalizzati oltre alle stringhe. In .NET 6 la Debug classe include nuovi overload di Assert, WriteIfe 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, potresti osservare una differenza nel comportamento.

Comportamento precedente

Nel codice seguente, r.ToString() viene sempre invocato.

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

Nuovo comportamento

Nel codice r.ToString() seguente 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 cambiamento che interrompe la compatibilità

Questa modifica può influire sulla compatibilità del codice sorgente .

Motivo della modifica

Questa modifica è stata introdotta per migliorare le prestazioni.

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

Le API interessate