Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Es ist üblich, interpolierte Zeichenfolgen als Assertionsmeldungen zu verwenden, z. B.:
Debug.Assert(result != x, $"Unexpected result {result}");
Jedoch wird in früheren Versionen bei jedem Aufruf eine Zeichenfolge für die Nachricht erstellt, die das Formatierungsergebnis einschließt, selbst wenn die Bedingung true
ist. Und die typische Verwendung für Behauptungen besteht darin, dass es sich um eine Bedingung handelt, die immer wahr sein sollte.
C# 10 bietet unterstützung für eine bessere Zeichenfolgeninterpolation, einschließlich der Möglichkeit, benutzerdefinierte "Handler" zusätzlich zu Zeichenfolgen als Ziel zu verwenden. In .NET 6 verfügt die Debug Klasse über neue Überladungen von Assert, WriteIfund WriteLineIf die diese Funktionalität verwenden, um die interpolierten Zeichenfolgenformatierungselemente nur bedingt auszuwerten, wenn die Nachricht erforderlich ist. Der C#-Compiler bevorzugt diese neuen Überladungen. Wenn die Formatierungselemente den Zustand verändern und das Programm darauf angewiesen war, dass diese Veränderungen sichtbar sind, auch wenn der Assert nicht ausgelöst wurde, könnten Sie einen Unterschied im Verhalten beobachten.
Vorheriges Verhalten
Im folgenden Code wird r.ToString()
immer aufgerufen.
Debug.Assert(true, $"{r.ToString()}");
Neues Verhalten
Im folgenden Code wird r.ToString()
nie aufgerufen, weil die Nachricht nur benötigt wird, wenn die Bedingung false
ist.
Debug.Assert(true, $"{r.ToString()}");
Eingeführte Version
6.0 RC 1
Art der einschneidenden Änderung
Diese Änderung kann sich auf die Quellkompatibilität auswirken.
Grund für Änderung
Diese Änderung wurde eingeführt, um die Leistung zu verbessern.
Empfohlene Aktion
Interpolierte Zeichenfolgen, die mit Debug-Methoden verwendet werden, sollten den freigegebenen Zustand nicht mutieren. (Diese Methoden sind auch von der DEBUG
-Kompilierungskonstante bedingt.) Wenn es aus irgendeinem Grund wichtig ist, das alte Verhalten beizubehalten, fügen Sie eine (string)
-Umwandlung vor der interpolierten Zeichenfolge hinzu. Diese Umwandlung zwingt den Compiler, die vorhandene Überladung zu binden und sicherzustellen, dass die Zeichenfolge immer materialisiert wird.
Betroffene APIs
- 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)