2010-11-19 29 views
5

我目前正在C#开发一个小型AI框架(遗传算法/神经网络),用于大学项目。你如何在.NET中的算法代码中声明?

我首先关心的是开发一个可重用的框架,所以我设计的一切都是非常模块化的。我知道我为此付出了代价(性能),但是我觉得我有更多的收获而不是失败(最好让代码慢两倍,不得不失去两倍的时间,之后尝试找到不可能的发现错误并失去很多时间试图添加新的东西,很难引入一个单一的代码块)。

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

我可以看到完成这几个方面:

  1. System.Diagonists.Assert家庭的方法。
  2. 代码契约/
  3. 有如果(X)再抛通过#如果DEBUG包围InvalidStateException()#ENDIF

,你会怎么做呢?为什么?

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

回答

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

不要代码合同以类似的方式工作吗?我有想法,你可以完全关闭他们在释放模式,或类似的东西。 – 2010-11-19 06:11:08

+0

也许吧。老实说,我不熟悉它。我答案中的技巧是我使用的技术,所以我想我会分享它。我不能说代码合同是好还是差。 – cdhowie 2010-11-19 06:12:08

+0

我会与什么cdhowie说。代码合同提供了更多,但可能不是你所需要的。所以我认为正确的工具是使用Conditional属性修饰的方法,而不是内联#if,#else或Debug.Asset()将内联代码混乱。 – 2010-11-19 06:54:27

0

#if/#endif的好处是,不仅是呼吁消除断言功能,还有所有准备其参数的工作(希望没有副作用......)。

+2

与[[条件(...)]'相同。 – cdhowie 2010-11-19 06:24:38