代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

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

  •  5
  • devoured elysium  · 技术社区  · 14 年前

    我目前正在为一个大学项目开发一个小型的人工智能框架(遗传算法/神经网络)。

    我的第一个关注点是开发一个可重用的框架,所以我设计的所有东西都是非常模块化的。我知道我正在为此付出代价(性能),但我觉得我有更多的收获,而不是失去它(最好有两倍的代码慢,而不是不得不失去两倍的时间后,试图找到不可能找到的错误和失去大量的时间,试图添加新的东西,是很难在一块代码)。

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

    我可以看到实现这一点的几种方法:

    1. 系统。诊断学家。断言方法系列。
    2. 代码合同
    3. 如果有if(x),则抛出InvalidStateException()并将其包围

    你会怎么做?为什么?

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

    2 回复  |  直到 14 年前
        1
  •  8
  •   cdhowie    14 年前

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

    [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");
    

    由于conditionaltattribute,只有在设置调试符号时编译器才会发出对此方法的调用。所以你不需要用任何 #if 指令。这将减少代码混乱。

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

        2
  •  0
  •   Ben Voigt    14 年前

    优势 #if / #endif 这不仅消除了对assert函数的调用,而且还消除了准备其参数的所有工作(希望没有副作用…)。