【问题标题】:Out-of-the-box Code Contracts in .NET 4.0.NET 4.0 中的开箱即用代码协定
【发布时间】:2011-08-12 17:48:23
【问题描述】:

我真的很想在 Visual Studio 2010 中试用新的代码合同,但我不想为 Visual Studio 安装额外的扩展(因为我的代码与我的同事共享)。 现在,当面向 .NET 4.0 时,我可以使用新的 System.Diagnostics.Contracts 命名空间,但我还没有让它做任何事情。

例如,使用

static void Main(string[] args)
{
    Greet(null);
    Console.ReadLine();
}

private static void Greet(string name)
{
    Contract.Requires(name != null);
    Console.Out.WriteLine("Hello {0}", name);
}

程序编译并运行(显示“Hello”),没有任何警告。如果我尝试使用Contract.Requires<ArgumentNullException>(name != null),我会收到一条消息,告诉我必须使用重写器,而不管名称的值如何。 谷歌告诉我,当我安装 Code Contracts 高级版时,我可以获得任何魔法,但是如果我不安装,这个命名空间的目的是什么?除了开箱即用的复杂 cmets 之外,我可以将代码合同用于其他用途吗?

【问题讨论】:

    标签: c# visual-studio-2010 code-contracts


    【解决方案1】:

    好吧,如果您定义了CONTRACTS_FULL 预处理器符号,那么各种Contract.* 方法将由于未运行重写器而失败(根据 cmets)。除非您定义预处理器符号,否则它们将在编译时被忽略。

    在框架中包含最低限度的代码契约类的目的是为了在部署代码时无需安装额外的软件 - 但您确实需要安装额外的工具以进行构建时后处理。

    【讨论】:

    • 定义 CONTRACTS_FULL 甚至会使非通用版本的 Require 要求重写,但我当然忘记了部署代码 cough。谢谢!
    • @Jens:“要求重写器”是什么意思?我预计它只会抛出一个异常......
    • 我收到一个断言失败消息“在使用 Contract.Requires 时必须使用重写器”。
    • @Jens:很公平——我认为在 .NET 4 beta 中它只是抛出了一个 ContractException。没有把握。不过会编辑。
    【解决方案2】:

    我想答案在于您反对安装扩展程序。开箱即用的合同意味着您可以使用您希望的所有合同,您的同事将能够在不安装任何扩展的情况下编译代码。

    然后,您可以继续安装扩展程序并从合同中获得真正的好处,而不会对您的同事提出任何新要求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多