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