Vyhodnocení podmíněného řetězce v metodách ladění
Interpolované řetězce se běžně používají jako zprávy assert, například:
Debug.Assert(result != x, $"Unexpected result {result}");
V předchozích verzích to však způsobí, že se pro zprávu vytvoří řetězec, včetně výsledku formátování, při každém volání, i když je true
podmínka . Typické použití pro tvrzení je, že se jedná o podmínku, která by měla být vždy pravdivá.
C# 10 přidává podporu pro lepší interpolaci řetězců, včetně možnosti cílit na vlastní "obslužné rutiny" kromě řetězců. V rozhraní .NET 6 Debug má třída nové přetížení Assert, WriteIfa WriteLineIf které využívají tuto funkci k podmíněnému vyhodnocení interpolovaných položek formátování řetězců pouze v případě, že je zpráva nutná. Kompilátor jazyka C# dává přednost těmto novým přetížením. Pokud položky formátování ztlumily stav a program se spoléhal na tyto mutace, aby byly viditelné i v případě, že se výraz neaktivoval, mohli byste pozorovat rozdíl v chování.
Předchozí chování
V následujícím kódu r.ToString()
by bylo vždy vyvoláno.
Debug.Assert(true, $"{r.ToString()}");
Nové chování
V následujícím kódu se nikdy nevyvolá, r.ToString()
protože zpráva je nutná pouze v případě, že podmínka je false
.
Debug.Assert(true, $"{r.ToString()}");
Zavedená verze
6.0 RC 1
Typ zásadní změny
Tato změna může mít vliv na kompatibilitu zdroje.
Důvod změny
Tato změna byla zavedena za účelem zvýšení výkonu.
Doporučená akce
Interpolované řetězce používané s metodami Debug by neměly ztlumit sdílený stav. (Tyto metody jsou také podmíněné na konstantě DEBUG
kompilace.) Pokud je z nějakého důvodu důležité zachovat staré chování, přidejte (string)
před interpolovaný řetězec přetypování. Toto přetypování vynutí kompilátor, aby se sváže s existujícím přetížením a zajistilo, že řetězec bude vždy materializován.
Ovlivněná rozhraní API
- 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)