代码之家  ›  专栏  ›  技术社区  ›  Joan Venge

C#4.0中的合约

  •  2
  • Joan Venge  · 技术社区  · 16 年前

    如果我有 Vector3.Normalize() 指定生成结果的后置条件的方法 Vector3 如果长度为1,编译器将如何在编译时(或之前)检查它?它只是随机通过 三维向量 方法的变量?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Daniel Earwicker    16 年前

    这不是C#4.0的一个特性。这是CLR 4.0的一个独立于语言的功能,在IL级别工作。它确实有一些执行静态检查的能力,但不是针对每种情况。它实际上会分析普通编译器为您使用的任何语言生成的IL,找到您在代码中设置的约束,然后查看代码以确定它是否符合合同。静态检查(至少在我看过的演示中)是一个可选功能。

        2
  •  1
  •   Scott Dorman    16 年前

    我非常确定C#4.0中的代码契约内容将在运行时而不是编译时发生,并且您需要在调用中实际指定条件。假设你的Vector3类有一个Length属性,你最终会得到这样的结果:

    Expects(vector3.Length == 1);
    

    这实际上会在某种编译后步骤中遇到一些IL重写,最终基本上会在尝试中包装方法的主体。最后,后条件测试在最终块中。

    推荐文章