代码合同在运行时

Dar*_*der 19 .net c# production code-contracts

就我在一本简单的书中所读到的,代码契约可能会降低运行时性能.

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

Jon*_*eet 32

用户手册中有相当数量的详细解释了这一点-有各种各样的,你可以有选择.每个构建配置可以具有在执行时检查合同的不同设置,并且它不是"全有或全无"选择 - 您可以根据可在Visual Studio中调整的设置强制执行全部,部分或不执行任何合同.


Ste*_*ary 12

在博客上描述了我最喜欢的选项.

总结一下:

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

有些人更喜欢将Preconditions包含在他们的Release版本中.如果通过NuGet分发,这尤其有用,因为它们不支持Code Contract dll.对于我的NuGet包,我正在迁移到Release版本中包含Preconditions,但也为"没有Preconditions的Release"构建单独下载.


Dav*_*ack 7

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

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

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

恕我直言,使用Contract.Requires<TException>()远比Contract.Requires()你控制抛出的异常类型更有用.

  • 你评论中的操作短语是"......几乎所有论证异常......".我不想基于"差不多"设置合同.如果我可以保证它们都是相同类型的Exception,那么使用Contract.Requires <TException>()是多余的.然而,这并不能保证,我宁愿涵盖所有场景 - 特别是边缘案例 - 否则你的合同只不过是推测. (4认同)