如果我在Visual Studio中爲我的C#項目定義調試常量,我可以確定斷言將被評估,並且在失敗時顯示一個消息框。但是什麼標誌,屬性使CLR在運行時實際上決定是否評估和顯示斷言。 DEBUG定義時,斷言代碼是否在IL中結束?或者它是彙編的DebuggableAttribute中關鍵點DebuggableAttribute.DebuggingModes標誌?如果是這樣,它的枚舉值必須存在嗎?這是如何工作的?是什麼讓CLR顯示斷言?
2
A
回答
5
如果在未定義DEBUG預處理器符號的情況下進行編譯,則任何對Debug.Assert的調用都將從編譯代碼中忽略。
如果你看docs for Debug.Assert你會發現它有[ConditionalAttribute("DEBUG")]
的聲明。 ConditionalAttribute用於決定編譯時是否實際發出方法調用。
如果一個條件屬性意味着沒有進行調用,那麼任何參數評估也會被忽略。這裏有一個例子:
using System;
using System.Diagnostics;
class Test
{
static void Main()
{
Foo(Bar());
}
[Conditional("TEST")]
static void Foo(string x)
{
Console.WriteLine("Foo called");
}
static string Bar()
{
Console.WriteLine("Bar called");
return "";
}
}
當定義的測試,這兩種方法分別稱爲:
c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe
Bar called
Foo called
當測試沒有定義,也不叫:
c:\Users\Jon> csc Test.cs /d:TEST
c:\Users\Jon> test.exe
2
對System.Diagnostics.Debug類和DEBUG定義的方法的ConditionalAttribute。
相關問題
- 1. 是什麼讓searchDisplayController顯示scopeBar?
- 2. 什麼是Java中使用斷言的
- 3. WS-I BP2012斷言是什麼意思?
- 4. 什麼是斷言失敗的原因
- 5. 爲什麼Q_ASSERT而不是斷言
- 6. 什麼是CLR託管?
- 7. 爲什麼斷言:android.net.cts.ListeningPortsTest :: testNoListeningUdp6Ports
- 8. 爲什麼斷言失敗
- 9. .NET中CLR(公共語言運行時)的含義是什麼?
- 10. 爲什麼Clrver顯然沒有顯示所有CLR處理
- 11. 如何讓mocha在斷言錯誤中顯示整個對象?
- 12. 什麼是斷言?你爲什麼要使用它們?
- 13. 爲什麼斷言追加默認斷言消息
- 14. 顯示「選擇語言」界面的最佳方法是什麼?
- 15. 什麼是顯示語言選擇的最佳方式?
- 16. FEST:斷言JButton顯示某個圖標
- 17. 用robolectric顯示斷言消息
- 18. 如何顯示Saml斷言節點?
- 19. 斷言numpy.array是否相等的最好方法是什麼?
- 20. 這是什麼顯示無?
- 21. 爲什麼Java代碼覆蓋率仍顯示黃色啓用斷言
- 22. 是什麼讓對話框可以顯示?
- 23. 是什麼讓這個圖像顯示在我的WPF usercontrol中?
- 24. 爲什麼斷言不相等?
- 25. 爲什麼我得到斷言錯誤?
- 26. 什麼讓編程語言更快?
- 27. 爲什麼我的CLR函數不斷消失
- 28. 「CLR20r3」代表什麼? (什麼版本的clr是它)
- 29. 相當於Nunit的斷言是什麼?在Xunit中呢?
- 30. 什麼是所有可能的斷言功能?