提问人:mathgenius 提问时间:8/2/2020 更新时间:8/3/2020 访问量:51
在阅读有关代码契约的信息时,我无法辨别它们的目标
Upon reading about Code Contracts I cannot discern their goal
问:
我已经开始阅读 c# 中的代码协定,但尽管对前置条件和后置条件进行了所有解释,但它们没有提到它们的实际作用。
它们是否是检查或约束,如果在运行时失败,则会引发异常?
它们是否检查设计时,如果不满足其条件,则会引发警告或错误?
答:
1赞
Jeffrey L Whitledge
8/3/2020
#1
C# 中的(现已放弃的)代码协定功能实际上执行了这两个选项中的任何一个,具体取决于它的配置方式以及您运行的 Visual Studio 版本。
代码协定的主要目的是证明某些程序状态在任何执行中都是不可能的。此证明将在编译时执行。这些证明的主要原因是确保程序是正确的。但是,理想情况下,这也将允许删除与不可能的程序状态相关的任何运行时检查,从而提高性能。
有时这种证明是不可能的,约束将作为普通(运行时)断言实现。系统也可以配置为在运行时检查所有约束。
此外,还可以将系统配置为忽略所有约束。
协定代码是在编译阶段之后由重写程序创建的,该重写程序对编译器输出的 IL 代码进行操作。因此,无论代码协定系统如何配置,原始编译器输出都是相同的。
评论
0赞
Jeffrey L Whitledge
8/5/2020
@mathgenius - 我不知道任何关于它为什么被放弃的官方消息,但我想这不是优先事项。对许多人来说,这是一个非常令人失望的事态发展。最近,C# 中增加了“可为 null 的引用类型”功能,它涵盖了代码协定实际使用的非常大的子集,这是一件非常好的事情。希望将来能添加更多这样的东西。
评论