2012-01-30 25 views
11

我以前在StackOverflow上看到一个线程,对此有一些讨论,但是我无法再次找到它!在Release版本中使用System.Diagnostics.Contract

我很想知道System.Diagnostics.Contract类是否应该在'真实代码'中使用,即生成代码的发布版本?我问这个问题,因为根据名称空间描述,看起来合同是为了调试或分析目的。

它似乎是一个有用的库,其中功能的前/后条件很重要,并且可能会避免在编写大量if/then/else检查时的一些努力,所以如果是这种情况,核心库?

+1

请不要用“C#”等标题加前缀。这就是标签的用途。 – 2012-01-30 17:59:40

回答

11

5.1节(参数验证和合同)的documentation的细节,你可能会考虑使用合同的三种主要使用模式:通过合同仅在调试

  1. 参数验证建立,而不是在发布版本。
  2. 在发布版本中也进行验证。
  3. 发布版本中的自定义参数验证,仅在调试版本中签约。

因此,至少在官方文档中,至少有一种使用模式可以在Release版本中使用合同。

报价:

您开始使用自己的代码合同之前,你需要做出一些决定是什么影响合同的形式,以用于参数验证,并在那里(见图2)。请注意,您可以为您生成的每个托管程序集(每个项目)独立做出这些决策:

合约工具的最简单使用方法是如果您决定在发布版本中不需要在运行时执行参数验证(用法1)。在这种情况下,您在开发过程中使用合同工具,而不是在交付的位上。请记住,您可以随合适的版本发布契约引用程序集,以便客户端可以通过调用站点检查其调试版本的运行时检查参数验证。

如果您需要在发布版本中进行参数验证,第二种最简单的方法是打开所有构建中的契约检查(用法2)。因此,您可以利用这些工具生成条件的运行时字符串并为您执行合同继承。您可以选择为参数验证生成特定的例外,或者拥有默认的ContractException。在发布版本中使用合同工具的风险是您依赖于尚未达到生产质量级别的工具。

最棘手的组合是当你想在发布参数验证版本,但你正在使用运行时检查只在调试版本的合同工具,而不是在发布版本(用法3)。在那种情况下,你必须继续按照你已经做的方式来写你的参数验证,即使用if-then-throw语句(我们称之为遗留需求)。如果您希望这些工具可被发现,请在其后添加其他合同(如确保),或者使用Contract.EndContractBlock()(如果没有其他合同)。请注意,因为您没有在发布版本中使用运行时检查工具,所以您不会获得任何合同继承,并且您必须在覆盖和接口实现上手动重复您的遗留要求。对于接口和抽象方法,如果您编写具有正常需求的合同类,并且确保表单能够检入调试构建,并且它们出现在合同引用程序集中,并因此对依赖项目和静态检查程序可见,您仍然可以获得最多的benet。

这也暗示了仅仅使用框架的其他部分的替代方案:使用if-then-throw的常用方法。

相关问题