簡體   English   中英

.NET 斷言斷言已啟用

[英].NET assert assertions are enabled

如何斷言在 C# 中啟用了斷言?

這是 Java 相關答案的鏈接,該答案在 C# 中不起作用。

這樣做的目的是為了防止使用發布類型的程序集,因為在不考慮效率的情況下,我可能會在所有斷言都正常運行的情況下運行,因此在某些地方傾向於使用調試類型的程序集。

Debug.Assert(false)使用並不令人滿意,因為它會創建一個對話框並需要用戶交互。 知道斷言在沒有“噪音”的情況下工作會很好。 Java 解決方案是無噪音的。

編輯:這取自已接受答案下的評論。

public static class CompileTimeInformation
{
    public static void AssertAssertionsEnabled()
    {
        // Recall that assertions work only in the debug version of an assembly.
        // Thus the assertion that assertions work relies upon detecting that the assembly was compiled as a debug version.

        if (IsReleaseTypeAssembly())
            throw new ApplicationException("Assertions are not enabled.");
    }

    public static bool IsReleaseTypeAssembly()
    {
        return ! IsDebugTypeAssembly();
    }

    public static bool IsDebugTypeAssembly()
    {
        return
            #if DEBUG
                true
            #else
                false
            #endif
        ;
    }
}

更新:有一個更簡單的解決方案。 另一個仍然在下面供好奇。

public static bool AreAssertionsEnabled =
 #if DEBUG
  true
 #else
  false
 #endif
 ;

看起來很討厭,但很簡單。


我們先來看看是什么原因導致Debug.Assert在非 DEBUG 構建中消失:

[Conditional("DEBUG"), __DynamicallyInvokable]
public static void Assert(bool condition)
{
    TraceInternal.Assert(condition);
}

它是[Conditional("DEBUG")] 這激發了以下解決方案:

public static bool AreAssertionsEnabled = false;

static MyClassName() { MaybeSetEnabled(); /* call deleted in RELEASE builds */ }

[Conditional("DEBUG")]
static void MaybeSetEnabled()
{
    AreAssertionsEnabled = true;
}

您可能可以重構它,以便AreAssertionsEnabled可以是readonly 我只是暫時想不出辦法。

您現在可以檢查布爾值AreAssertionsEnabled並基於它執行您喜歡的任何邏輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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