.NET assert 断言已启用

.NET assert assertions are enabled

如何断言在 C# 中启用断言?

Here's a link to a related answer for Java, that does not work in 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 并根据它执行您喜欢的任何逻辑。