代码合同和编译

时间:2011-05-27 18:10:05

标签: .net code-contracts

过多使用代码合同会降低编译过程的速度。 其次代码契约是调试模式的一部分,只有当我设置代码契约并始终在发布模式下编译代码时,代码合同才会起作用?我想这并不意味着开发人员将被迫在调试模式下工作,并且当您创建设置时,请将其设置为发布模式。我是对的吗?

2 个答案:

答案 0 :(得分:4)

由于CodeContracts的工作方式,编译速度有所降低。有一个IL重写器,它根据您指定的合同将代码注入到您的方法中。这发生在C#编译器出现并为您的程序集生成IL之后。

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

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

如果您正在使用或计划使用Contract.Requires<TException>并且未启用“运行时合同检查”,则会发现运行时失败,因为IL重写器需要受限于代码合同的使用。然后,您将需要启用运行时合同检查才能使其生效。

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

编辑:我忘记添加的一件事是IL Rewriter完全独立于C#编译器,两者之间没有依赖关系。

答案 1 :(得分:0)

假设来自MS Devlab的代码合同,

  1. 编译:合同工具在编译后激活。有一个用于运行时检查的重写器,它需要(一点点)时间作为构建的一部分 静态验证程序在此之后运行,但在后台运行。您不必等待它,除非您想立即查看消息。

  2. 运行时行为。这可以通过多个步骤进行配置,从完全关闭(基准),仅需要/需要+确保(发布)到完全(分析/调试)。