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

dev*_*ium 5 .net c# oop algorithm code-contracts

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

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

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

我可以看到几种方法来完成这个:

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

你会怎么做,为什么?

我也知道单元测试(我正在使用它们),但我也想在代码上有一些断言.

cdh*_*wie 8

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

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

并断言如此,假设该方法在一个名为Util:

Util.Assert(a == b, "a == b");
Run Code Online (Sandbox Code Playgroud)

由于ConditionalAttribute,只有在设置了DEBUG符号时,编译器才会调用此方法.因此,您不需要在任何#if指令中包含此类调用.这将导致更少的代码混乱.

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