代码合同在运行时

时间:2011-07-14 18:28:09

标签: c# .net code-contracts production

据我简要介绍,代码契约可能会降低运行时性能。

是否可以在生产中禁用代码合同?

4 个答案:

答案 0 :(得分:32)

user manual详细解释了这一点 - 您可以拥有各种选项。每个构建配置可以具有在执行时检查合同的不同设置,并且它不是“全有或全无”选择 - 您可以根据可在Visual Studio中调整的设置强制执行全部,部分或不执行任何合同。

答案 1 :(得分:12)

我有我最喜欢的选项on my blog

总结:

  • 在发布模式下,我建议取消选中“执行运行时合同检查”,但选择“构建合同参考大会”。这会将Preconditions放在一个单独的dll中,客户可以选择使用它(如果他们检查Call-site Requires Checking),但如果他们不检查该选项,则删除所有开销。
  • 在“调试”模式下,将“执行运行时合同检查”设置为“完整”。

有些人更喜欢将Preconditions包含在他们的Release版本中。如果通过NuGet进行分发,这尤其有用,因为they don't support Code Contract dlls。对于我的NuGet包,我正在迁移到Release版本中包含Preconditions,但也为“无前提条件发布”版本单独下载。

答案 2 :(得分:7)

性能差异非常小,不会以明显的方式影响您的代码。除非你正在开发一些实时股票交易系统,否则我真的不会担心它。

至于禁用生产中的代码,我宁愿得到代码合同的额外保护,而不是一些可能模糊的错误。代码合同中的错误将告诉您违反合同的确切位置和原因,而不是仅仅因为在调用堆栈树的5个级别中传递了一些错误数据而不得不深入调用堆栈。

@svanryckeghem和@Stephen Cleary: 如果您正在使用或计划使用Contract.Requires<TException>并且未启用“运行时合同检查”,则会发现有关IL重写器(ccrewrite.exe)的运行时故障需要绑定到代码合同的使用。然后,您将需要启用运行时合同检查才能使其生效。

恕我直言,使用Contract.Requires<TException>()Contract.Requires()更有用,因为您可以控制抛出的异常类型。

答案 3 :(得分:4)

在项目属性中,转到代码合约,选择“发布”配置并取消选中运行时检查。