[英].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.