簡體   English   中英

Debug.Assert並不總是在C#中工作

[英]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.Assert不評估,但屬性為

該代碼在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM