Contract.Ensures如何运作?

时间:2011-08-13 19:00:54

标签: c# code-contracts

我开始使用代码合约,而Contract.Requires非常简单,我很难看到Ensures实际上做了什么。

我尝试过创建一个这样的简单方法:

static void Main()
{
    DoSomething();
}

private static void DoSomething() 
{
    Contract.Ensures(false, "wrong");
    Console.WriteLine("Something");
}

我从来没有看到消息“错误”,也没有抛出异常或其他任何内容。

那它实际上做了什么?

1 个答案:

答案 0 :(得分:22)

它没有扔任何东西很奇怪 - 如果你正在使用适当的设置运行重写器工具。我的猜测是你在一个不检查后置条件的模式下运行。

关于Contract.Ensures的令人困惑的事情是你在方法开始时它,但它在方法结束时执行。重写器完成所有魔术以确保其正确执行,并在必要时给予返回值。

与Code Contracts的许多内容一样,我认为最好在重写器工具的结果上运行Reflector。确保你有正确的设置,然后弄清楚重写者做了什么。


编辑:我发现我还没有表达Contact.Ensures。简而言之,这是为了确保您的方法在最后完成某些操作 - 例如,它可以确保它将某些内容添加到列表中,或者(更有可能)返回值为非null,或者为正或者其他任何内容。例如,您可能有:

public int IncrementByRandomAmount(int input)
{
    // We can't do anything if we're given int.MaxValue
    Contract.Requires(input < int.MaxValue);
    Contract.Ensures(Contract.Result<int>() > input);

    // Do stuff here to compute output
    return output;
}

在重写的代码中,将在返回时检查 ,以确保返回的值 大于输入。