[英]Debug.Assert not always working in c#
我有一個奇怪的問題,即斷言被忽略。 您可以通過以下最小示例來重現它。 我想知道為什么會出現此問題以及如何解決它:
public class TestAssert
{
public string EmptyString
{
get
{
System.Diagnostics.Debug.Assert(false);
return string.Empty;
}
}
Dictionary<string, object> dict = new Dictionary<string, object>();
public void ShowAssertIgnored()
{
var foo = dict[EmptyString];
}
}
您可以看到即使評估了該屬性,也會忽略Debug.Assert(false)
。 剛打電話
var test = new TestAssert();
test.ShowAssertIgnored();
該代碼在Debug (其他斷言可以正常工作!),32位,x86 + AnyCPU,VS2012 Professional,.Net Framework 4中編譯並運行。
編輯:該項目是一個控制台應用程序,我已經連續運行了好幾次。 在System.Diagnostics.Debug.Assert(false);
之前有一個斷點System.Diagnostics.Debug.Assert(false);
通常會出現一個消息框。 但並非總是如此:當我多次嘗試相同的情況時,有時會在控制台中看到結果。
再說一遍:我可以在VS2012調試器中重現非確定性行為!
如果您閱讀了這些文檔 ,將會看到Debug.Assert
不是要拋出的。
通常,Assert(Boolean)方法用於在程序開發過程中識別邏輯錯誤。 斷言評估條件。 如果結果為假,則它將失敗消息發送到Listeners集合。 您可以通過向Listeners集合添加TraceListener或從其中刪除一個TraceListener來自定義此行為。
當應用程序在用戶界面模式下運行時,它將顯示一個消息框,其中顯示了帶有文件和行號的調用堆棧。 該消息框包含三個按鈕:中止,重試和忽略。 單擊“中止”按鈕將終止應用程序。 如果您的應用程序在調試器中運行,則單擊“重試”會將您轉到調試器中的代碼,如果您的應用程序未在調試器中運行,則單擊它可以打開。 單擊忽略繼續執行代碼中的下一條指令。
如果在UI環境中運行,它可能會觸發在UI環境/測試運行器所設置的偵聽器中定義的類拋出行為。
因此,簡而言之, Debug.Assert(false)
不會暫停您的應用程序,但它的偵聽器可能會暫停。
假設這里沒有UI ...如果您希望代碼失敗,那么您需要編寫自己的TraceListener:
public class MyTraceListener : TraceListener
{
public override void Write(string msg)
{
throw new Exception(msg);
}
public override void WriteLine(string msg)
{
throw new Exception(msg);
}
}
並將其添加到listeners集合中:
Debug.Listeners.Add(new MyTraceListener());
這是預期的行為 , Debug.Assert()
僅在調試版本中起作用:
默認情況下,Debug.Assert方法僅在調試版本中起作用。 如果要在發行版本中進行斷言,請使用Trace.Assert方法。 有關更多信息,請參見托管代碼中的斷言。
https://msdn.microsoft.com/zh-CN/library/kssw4w7z(v=vs.110).aspx
如果希望它也可以在發行版中使用,請使用Trace.Assert()
。
您是否檢查過項目設置以定義DEBUG常量? Debug.Assert()方法具有[ConditionalAttribute(“ DEBUG”)]屬性,這意味着,如果未定義“ DEBUG”常量,則在編譯期間將忽略它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.