偵錯方法中的條件式字串評估

通常會使用差補字串作為判斷提示訊息,例如:

Debug.Assert(result != x, $"Unexpected result {result}");

不過,在舊版本中,這會導致在每次呼叫時針對訊息建立字串 (包括格式化結果),即使條件為 true 也是一樣。 而一般判斷提示用法是其與應該一律為 true 的條件有關。

C# 10 新增可以加強字串插補的支援,包括除了字串之外,還能夠以自訂「處理常式」為目標。 在 .NET 6 中,Debug 類別具有 AssertWriteIfWriteLineIf 的新多載,只有在需要訊息時,才利用這項功能有條件地評估差補字串格式化項目。 C# 編譯器將偏好這些新的多載。 如果格式化項目是變動狀態,而且程式依賴那些變動來顯示 (即使未引發判斷提示也是一樣),則您還是可以觀察到行為差異。

先前的行為

在下列程式碼中,一律會叫用 r.ToString()

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

新的行為

在下列程式碼中,永遠不會叫用 r.ToString(),因為只有在條件為 false 時才需要訊息。

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

導入的版本

6.0 RC 1

中斷性變更的類型

此變更可能會影響來源相容性

變更原因

推出此變更是為了提升效能。

Debug 方法搭配使用的差補字串不應該變動共用狀態。 (在 DEBUG 編譯常數上,這些方法也是有條件的。)如果基於某些原因而必須維護舊的行為,則請在差補字串前面新增 (string) 強制型轉。 此強制型轉會強制編譯器繫結至現有多載,並確保一律具體化字串。

受影響的 API