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.
Azione consigliata
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
- System.Diagnostics.Debug.Assert(Boolean, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String)
- System.Diagnostics.Debug.Assert(Boolean, String, String, Object[])
- System.Diagnostics.Debug.WriteIf(Boolean, String)
- System.Diagnostics.Debug.WriteIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteIf(Boolean, Object, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, String, String)
- System.Diagnostics.Debug.WriteLineIf(Boolean, Object, String)