【发布时间】:2009-01-29 17:45:51
【问题描述】:
如果我有一个Vector3.Normalize() 方法指定一个后置条件,其中结果Vector3 的长度将为1,编译器将如何在编译时(或之前)检查这个?它只是将一个随机的Vector3 变量传递给该方法吗?
【问题讨论】:
如果我有一个Vector3.Normalize() 方法指定一个后置条件,其中结果Vector3 的长度将为1,编译器将如何在编译时(或之前)检查这个?它只是将一个随机的Vector3 变量传递给该方法吗?
【问题讨论】:
这不是 C# 4.0 的特性。它是 CLR 4.0 的一个独立于语言的特性,在 IL 级别上工作。它确实有一些执行静态检查的能力,但不是针对每种情况。它实际上会针对您使用的任何语言分析由普通编译器生成的 IL,找到您放入代码中的约束,然后查看代码以确定它是否符合合同。静态检查(至少在我见过的演示中)是一个可选功能。
【讨论】:
我很确定 C# 4.0 中的代码契约内容将在运行时发生,而不是在编译时发生,并且您需要在调用中实际指定条件。假设你的 Vector3 类有一个 Length 属性,你最终会得到这样的结果:
Expects(vector3.Length == 1);
这实际上会在某种编译后步骤中遇到一些 IL 重写,这最终会基本上将方法的主体包装在 try..finally 中,其中后置条件测试位于 finally 块中。
【讨论】: