偵錯方法中的條件式字串評估
通常會使用差補字串作為判斷提示訊息,例如:
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)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應