Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È 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.
Azione consigliata
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
- 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)