Sdílet prostřednictvím


Vyhodnocení podmíněných řetězců v debugovacích metodách.

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 však toto při každém volání způsobí vytvoření řetězce pro zprávu, včetně výsledku formátování, i když je podmínka true. 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 má třída Debug nové přetížení Assert, WriteIf a 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 by položky formátování měnily stav a program se spoléhal na tyto změny, aby byly viditelné i v případě, že se příkaz assert nespustil, došlo by k rozdílu 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 r.ToString() se nikdy nevyvolá, protože zpráva je nutná pouze v případě, že podmínka je false.

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

Verze byla představena

6.0 RC 1

Typ zásadní změny

Tato změna může ovlivnit 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 měnit sdílený stav. (Tyto metody jsou také podmíněny konstantou DEBUG kompilace.) Pokud je z nějakého důvodu důležité zachovat staré chování, přetypování (string) přidejte před interpolovaný řetězec. Toto přetypování vynutí kompilátor, aby se vázal k existujícímu přetížení a zajistí, že řetězec bude vždy vytvořen.

Ovlivněná rozhraní API