【问题标题】:Contracts in C# 4.0C# 4.0 中的合同
【发布时间】:2009-01-29 17:45:51
【问题描述】:

如果我有一个Vector3.Normalize() 方法指定一个后置条件,其中结果Vector3 的长度将为1,编译器将如何在编译时(或之前)检查这个?它只是将一个随机的Vector3 变量传递给该方法吗?

【问题讨论】:

    标签: c# .net contracts


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这是否意味着 C# 可能没有 Spec# 语法?就像 Linq 是一个库,但 C# 3.0 内置了一些 Linq 关键字。采用 Spec# 风格的契约用法,C# 4.0+ 会不会也一样?
    • 根据 PDC 的公告,C# 4.0 肯定不会有 Spec# 语法。 “代码契约”是一个纯粹的 CLR 级别、独立于语言的功能。这符合微软现在的总体战略,即确保大多数功能适用于所有语言。
    【解决方案2】:

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

    Expects(vector3.Length == 1);
    

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

    【讨论】:

    • 一些可静态验证的合约将在编译时进行检查,但像您所说的这种情况会在运行时进行检查。
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2014-10-11
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多