代码之家  ›  专栏  ›  技术社区  ›  Will Marcouiller

在.NET4.0中,代码契约的实际用法是什么?

  •  35
  • Will Marcouiller  · 技术社区  · 16 年前

    真实世界 应用 Code Contracts .

    我想得到一个简单的解释代码样本,以帮助我开始和运行它。

    4 回复  |  直到 11 年前
        1
  •  24
  •   Richard JP Le Guen    12 年前

    The Code Contracts User Manual :

    契约允许您在运行时的代码中表示前置条件、后置条件和对象不变量 检查、静态分析和文档。

    代码契约用于 static verification ; 想象一下,如果在编译时,您不仅发现了语法错误,而且还发现了 逻辑错误 . 这是静态程序验证的愿景。

    您可以使用契约(和静态验证)来降低测试成本。。。特别是回归测试。举个例子,假设我写了一些代码来满足一些业务需求。。。但后来,性能需要改变,我需要优化。如果我首先编写一个契约,那么——当我的新优化代码被验证时——如果它不再满足原始契约,我将在IDE中得到一条错误消息,就像我有一个编译时错误一样。因此,您几乎可以立即发现并解决该bug,这比一轮测试的成本要低。

        2
  •  14
  •   Thorarin    16 年前

    有一个 freely available chapter about code contracts 在即将出版的书中 C# in Depth, second edition . 有个叫乔恩·斯基特的家伙,你们中的一些人可能很熟悉他:)

    至于实际用途。您可以在代码中的任何地方使用它们,但特别是如果您正在开发许多人将要使用的框架/API类型库,我希望它们会非常方便。代码的静态验证保存了 许多 与在运行时发现您没有处理某些边缘情况相比,时间要长得多。

    下面是这样一个例子:

    static int CountWhitespace(string text)
    {
        Contract.Requires<ArgumentNullException>(text != null, "text");
        return text.Count(char.IsWhiteSpace);
    }
    

    CountWhitespace 可能为空。此外,它将在运行时抛出ArgumentNullException。

    我最近才将我的私有类库转换为.NET4.0,但我计划很快向它添加代码契约。

        3
  •  8
  •   Roman Bats    11 年前

    在.Net中有很多地方使用合同。 >>Sources<<

        4
  •  5
  •   Mark Byers    16 年前

    你见过一只鸟吗 NullReferenceException 并希望编译器能在编译时警告您这一点,以避免发现困难的方法-与您的程序崩溃?

    使用代码契约,您可以编写如下内容:

    Contract.Requires(foo != null);
    

    这不仅仅是一个运行时检查-您可以设置它,这样如果您使用可能为null的参数调用此函数,您将得到一个编译错误。

    Address GetAddress(Customer customer)
    {
        Contract.Requires<ArgumentNullException>(customer != null, "customer");
        return addressBook.FindCustomer(customer);
    }
    
    推荐文章