次に例を示すように、補間文字列をアサート メッセージとして使用するのが一般的です。
Debug.Assert(result != x, $"Unexpected result {result}");
ただし、以前のバージョンでは、これにより、条件が 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