.net - 代码契约和编译

标签 .net code-contracts

过多使用代码契约是否会减慢编译过程。 其次,代码契约只是 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/

相关文章:

c# - 通用接口(interface)上的代码约定问题

c# - 如何隐藏 DataGridViewComboBoxColumn 的下拉箭头,如 Visual Studio Properties 窗口?

c# - 为什么这个基于字符串的 Contract.Ensure 调用未经证实?

c# - 由契约(Contract)和 build 者设计

c# - 代码契约与不使用它的框架一起

c# - 代码契约(Contract) : How to express these conditions?

.net - 为什么我们有两个 JWT token 类 JwtSecurityTokenHandler 和 JsonWebTokenHandler?

.net - .NET SynchronizationContext-将其发送/发布到哪个线程?

.net - KeyBinding 两个命令(一个在 VM 中,一个在 View 中)到一个键

c# - 如何使用 MySqlDataReader 从数据库中检索值?