你如何在.NET中的算法代码中断言?

时间:2010-11-19 06:01:52

标签: c# .net algorithm oop code-contracts

我目前正在C#中为大学项目开发​​一个小型AI框架(遗传算法/神经网络)。

我首先要关注的是开发一个可重用的框架,所以我设计的一切都非常模块化。我知道我为这个(性能)付出了代价,但我觉得我有更多的收获而不是失去它(最好是代码的两倍慢,而不是失去两倍的时间后来试图找不到发现错误并浪费大量时间尝试添加难以在单片代码块中引入的新内容。)

我想基本上对代码的不同部分进行大量检查,断言。检查运行方法XI是否确实处于正确状态等等。这种断言在开发时很有用,但我希望它们远离发布代码(也就是说,当我决定要离开时这是为了获得我的最终研究成果而在夜间工作。

我可以看到几种实现这个目标的方法:

  1. System.Diagonists.Assert系列方法。
  2. 代码合约
  3. if(x)然后抛出#if DEBUG / #endif
  4. 包围的InvalidStateException()

    你会怎么做?为什么?

    我也知道单元测试(我正在使用它们),但我也希望对代码有一些断言。

2 个答案:

答案 0 :(得分:8)

你可以使用这样的静态方法:

[Conditional("DEBUG")]
public static void Assert(bool condition, string message)
{
    if (!condition)
        throw new InvalidStateException("Assertion failed: " + message);
}

并断言如此,假设该方法是在名为Util的类中定义的:

Util.Assert(a == b, "a == b");

只有在设置了DEBUG符号时,编译器才会发出对此方法的调用,这要归功于ConditionalAttribute。因此,您不需要在任何#if指令中包含此类调用。这将减少代码混乱。

(请注意,该方法本身仍将被编译。这允许您在不同的程序集中使用此类方法!)

答案 1 :(得分:0)

#if / #endif的优点是不仅取消了断言函数的调用,而且还准备了所有准备其参数的工作(希望没有副作用......) )。