2011-05-27 62 views
2

代码合约使用太多会减慢编译过程。 其次代码合同是调试模式的一部分,只有当我设置代码合同并始终在发布模式下编译代码时,代码合同才会工作?我想它不会这意味着开发人员将被迫在调试模式下工作,并且当您创建设置时,将其设置为释放模式。我对吗?从MS Devlab代码合同和编译

+0

微软的.Net代码合同? – 2011-05-27 18:32:43

+0

是的,请标记语言和/或平台。 – 2011-05-28 20:24:34

+0

@ Ken,Henk:[code-contracts]标签专门用于微软的Code Contracts项目。 – porges 2011-05-30 07:11:48

回答

0

假设代码契约,

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

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

+1

还值得注意的是,静态验证器现在缓存条目,以便只重新评估自上一次构建以来发生更改的功能。 – porges 2011-05-30 03:03:18

+0

感谢@Henk和@Porges – Deepesh 2011-05-30 05:15:43

4

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

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

就禁用生产中的代码合同而言,我宁愿有代码合同的附加保护,以避免错误。代码合同中的一个错误会告诉你究竟违反合同的地点和原因,而不是因为某些不良数据在调用堆栈树上传入5个级别而不得不深入一些深层调用堆栈。

如果您正在使用或正在计划使用Contract.Requires<TException>并且未启用'运行时合同检查',那么IL重写程序需要绑定到代码合同的使用时会出现运行时失败。然后您将被要求启用运行时合同检查以使其发挥作用。

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

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