在.NET中断言参数和值的前置条件和后置条件的最佳方法是什么?

在.NET中断言参数和值的前置条件和后置条件的最佳方法是什么?,.net,design-by-contract,.net,Design By Contract,我最近一直在考虑契约式设计,我想知道人们认为在.NET中,什么是断言价值的前置条件和后置条件的最佳方式? i、 e.验证方法的参数值 有些人建议使用Debug.Assert,而有些人则讨论使用if语句并引发异常。每种方法的优缺点是什么 您推荐哪些框架可用?我更喜欢异常而不是断言,因为如果它应该是这样,而不是这样,我想知道它,这样我就可以修复它,而我们在调试模式下获得的覆盖率与实际使用率或覆盖率相差甚远,因此仅使用debug.Assert是不够的 使用断言意味着您不会向发布代码中添加膨胀,但这意味

我最近一直在考虑契约式设计,我想知道人们认为在.NET中,什么是断言价值的前置条件和后置条件的最佳方式? i、 e.验证方法的参数值

有些人建议使用Debug.Assert,而有些人则讨论使用if语句并引发异常。每种方法的优缺点是什么


您推荐哪些框架可用?

我更喜欢异常而不是断言,因为如果它应该是这样,而不是这样,我想知道它,这样我就可以修复它,而我们在调试模式下获得的覆盖率与实际使用率或覆盖率相差甚远,因此仅使用debug.Assert是不够的

使用断言意味着您不会向发布代码中添加膨胀,但这意味着您只有在调试构建中捕获到这些契约时才能看到它们何时以及为什么会被破坏

使用异常意味着无论何时发生、调试或发布,都会看到契约被破坏,但这也意味着发布版本包含更多的检查和代码

您可以使用中间的方法,并使用Trace将前置和后置条件跟踪到某种应用程序日志中,您可以使用这些日志来调试问题。但是,您需要一种获取这些日志的方法来了解用户遇到的问题。还有可能将其与异常结合起来,这样您就可以针对更严重的问题获得异常

但我认为,如果合同值得执行,那么在合同破裂时抛出一个例外也是值得的。我认为这在某种程度上取决于观点和目标应用程序。如果确实抛出异常,则可能需要某种形式的事件报告系统,以便在引发的异常未经处理时提供崩溃报告。

另一个选项是


Spec是面向对象语言C的扩展。它扩展了类型系统以包括非空类型和已检查的异常。它以前置和后置条件以及对象不变量的形式提供方法契约。

Spec#是实现方法,它是C#的超集。现在有了“”,这是Spec#的语言无关版本,因此现在可以在VB.NET中使用代码契约

当.NET4.0发布时,我们最终将使用代码契约。然而,在我们目前的生产代码中,我们已经成功地使用了“Guard”类以及生成异常的常用方法


有关更多详细信息,请参阅

您可以在
它的开源和免费

如果你能将Spec#应用到你的构建环境中,它非常适合这类东西。一般来说,一个好的DBC解决方案背后的想法包括编译时检查post和pre-conditions,为你提供一个更紧密的异常反馈环。