.NET断言断言已启用

时间:2015-05-31 11:23:28

标签: c# .net assertions

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

Here's a link to a related answer for Java, that does not work in C#.

这样做的目的是防止使用发布类型的程序集,因为在不考虑效率的情况下我可能会运行所有的断言,因此在某些地方偏好调试类型的程序集

使用Debug.Assert(false)并不令人满意,因为它会创建一个对话框并需要用户互动。知道断言在没有“噪音”的情况下工作会很好。 Java解决方案没有噪音。

1 个答案:

答案 0 :(得分:5)

更新:有一个更简单的解决方案。另一个仍然是好奇的。

int x = 2 ;
int *y = &x ;
printf("%d", *y);

看起来很讨厌,但很简单。

让我们首先看一下导致'student' redeclared as different kind of symbol在非DEBUG版本中消失的原因:

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

这是Debug.Assert。这激发了以下解决方案:

[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并根据它执行您喜欢的任何逻辑。