.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
并根据它执行您喜欢的任何逻辑。
如何断言在 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
并根据它执行您喜欢的任何逻辑。