デバッグ メソッドでの条件付き文字列の評価
補間された文字列は、たとえば次のように、アサート メッセージとして使用するのが一般的です。
Debug.Assert(result != x, $"Unexpected result {result}");
しかし、以前のバージョンでは、条件が true
であっても、呼び出しのたびに、書式設定の結果を含むメッセージの文字列が作成されます。 また、一般的に、アサートは常に true である必要がある条件に関して使用します。
C# 10 では、文字列に加えてカスタムの "ハンドラー" を対象とする機能など、より優れた文字列補間のサポートが追加されています。 .NET 6 では、Debug クラスに Assert、WriteIf、WriteLineIf のオーバーロードが新たに追加され、メッセージが必要な場合にのみ、この機能を利用して、補間された文字列の書式設定項目が条件付きで評価されます。 これらの新しいオーバーロードが、C# コンパイラによって優先されます。 書式設定項目の状態が変化していて、プログラムが、アサートが生じなくてもそれらの変化を表示できることに依存していた場合は、動作の違いを観察できます。
以前の動作
次のコードの r.ToString()
は常に呼び出されます。
Debug.Assert(true, $"{r.ToString()}");
新しい動作
次のコードの r.ToString()
は、条件が false
の場合にのみメッセージが必要とされるため、決して呼び出されません。
Debug.Assert(true, $"{r.ToString()}");
導入されたバージョン
6.0 RC 1
破壊的変更の種類
この変更はソースの互換性に影響を与える可能性があります。
変更理由
この変更は、パフォーマンスを向上させるために導入されました。
推奨アクション
Debug メソッドで使用する補間された文字列で、共有状態を変化させないでください。 (これらのメソッドは、DEBUG
コンパイル定数も必要とします)。何らかの理由で、以前の動作を維持することが重要な場合は、補間された文字列の前に (string)
キャストを追加してください。 キャストすると、コンパイラによって既存のオーバーロードにバインドされ、常に文字列が具体化されるように保証されます。
影響を受ける 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)
.NET