Как работает Contract.Ensures? - PullRequest
       14

Как работает Contract.Ensures?

19 голосов
/ 13 августа 2011

Я начинаю использовать кодовые контракты, и хотя Contract.Requires довольно прост, у меня возникают проблемы с просмотром того, что на самом деле делает Ensures.

Я пытался создать простой метод, подобный этому:

static void Main()
{
    DoSomething();
}

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

Я никогда не вижу сообщение "неправильно", и при этом оно не генерирует исключения или что-либо еще.

Так что же на самом деле делает?

1 Ответ

22 голосов
/ 13 августа 2011

Странно, что он ничего не выбрасывает - , если вы используете инструмент для перезаписи с соответствующими настройками.Я предполагаю, что вы работаете в режиме, который не проверяет постусловия.

В Contract.Ensures сбивает с толку то, что вы пишете в начале метода, но выполняет в конце метода.Программа перезаписи делает все возможное, чтобы убедиться, что она выполняется надлежащим образом, и при необходимости получает возвращаемое значение.

Как и во многих других отношениях с Code Contracts, я думаю, что лучше всего запускать Reflector для результатов 1013* инструмента переписывания.Убедитесь, что вы правильно настроили параметры, а затем поработайте над тем, что сделал переписчик.


РЕДАКТИРОВАТЬ: я понимаю, что еще не выразил точку из Contact.Ensures,Проще говоря, это означает, что ваш метод что-то сделал к концу - например, он может гарантировать, что он добавил что-то в список или (что более вероятно), что возвращаемое значение не является нулевым, или положительным, или что-то еще.Например, у вас может быть:

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;
}

В переписанном коде будет проверка в точке возврата , чтобы убедиться, что возвращаемое значение действительно равно больше, чем ввод.

...