Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.
Doporučená akce
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
- 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)