Sdílet prostřednictvím


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 truepodmí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.

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