过多使用代码契约是否会减慢编译过程。 其次,代码契约只是 Debug模式的一部分,如果我设置代码契约并始终在 Release模式下编译代码,那么代码契约会起作用吗?我想这不会,这意味着开发人员将被迫在 Debug模式下工作,并且当您创 build 置时,将其设置为 Release模式。我说得对吗?
最佳答案
由于 CodeContracts 的工作方式,编译速度会稍微变慢。有一个 IL 重写器可以根据您指定的契约将代码注入(inject)到您的方法中。这种情况发生在 C# 编译器出现并为程序集生成 IL 后。
运行时性能差异非常小,不会对您的代码产生明显影响。除非您正在开发一些实时股票交易系统,否则我真的不会担心它。
至于在生产中禁用代码契约(Contract),我宁愿对代码契约(Contract)进行额外的保护,以免出现一些可能掩盖的错误。代码契约中的错误将准确地告诉您违反契约的位置和原因,而不是仅仅因为一些错误数据在调用堆栈树的 5 层中传递而必须深入挖掘某些深层调用堆栈。
如果您正在使用或计划使用Contract.Requires<TException>
并且不启用“运行时契约检查”,您将收到有关 IL 重写器需要绑定(bind)到代码契约的使用的运行时故障。然后,您将需要启用运行时契约检查才能使其正常工作。
恕我直言,使用Contract.Requires<TException>()
比 Contract.Requires()
有用得多因为您可以控制抛出的异常类型。
编辑:我忘记补充的一件事是 IL 重写器完全独立于 C# 编译器,并且两者之间没有依赖关系。
关于.net - 代码契约和编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6156122/