据我简要介绍,代码契约可能会降低运行时性能。
是否可以在生产中禁用代码合同?
答案 0 :(得分:32)
user manual详细解释了这一点 - 您可以拥有各种选项。每个构建配置可以具有在执行时检查合同的不同设置,并且它不是“全有或全无”选择 - 您可以根据可在Visual Studio中调整的设置强制执行全部,部分或不执行任何合同。
答案 1 :(得分:12)
我有我最喜欢的选项on my blog。
总结:
有些人更喜欢将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)
在项目属性中,转到代码合约,选择“发布”配置并取消选中运行时检查。