Подтвердить что ты не робот

Контракт. Требуется использование

Вот моя проблема. Я очень большой поклонник Design by contract, я использую эту концепцию, особенно при разработке библиотек, которые могут быть использованы другими разработчиками. Я только что нашел новый способ сделать это: Contract.Requires вместо Exception: Поэтому вместо того, чтобы:

public void SomeMethod(string name){
   if(name==null) throw new NullArgumentException("Null values not supported");
} 

Теперь у меня есть:

public void SomeMethod(string name){
   Contract.Requires(name != null);
}

EDIT: я работаю под VS2010 в режиме отладки.

Проблема: Contract.Requires ничего не делает, даже если name есть null!

Документация MSDN гласит:

Задает договор предварительного условия для прилагаемого метода или свойство.

Но ничего не указано в случае, если условие не выполнено!

Я также заметил, что есть другие Contract.Requires перегрузки, которые генерируют исключение, отображают сообщение... но тогда что такое Contract.Requires(Boolean) для?

РЕДАКТИРОВАТЬ В ответе ниже указано, что плагин должен быть установлен, чтобы иметь полную мощность Contract API, но как насчет пользователей Mono, которые хотят, чтобы их код вел себя одинаково на разных платформах?

4b9b3361

Ответ 1

Вы должны сделать следующее:

  • Установите надстройку Code Contracts, когда nfechner отметил
  • Перейдите к свойствам проекта, папке "Контракты кода"
  • Отметьте 'Выполнить проверку выполнения времени выполнения'
  • Переключение "Режим сборки" на "Стандартный контракт требуется"
  • Подставив Contract.Requires в Contract.Requires<SomeException> (первая выбрала System.Diagnostics.ContractException, а вторая выбрала указанное вами исключение, важное для общедоступных методов)

Это базовая настройка. Для более точной конфигурации обратитесь к руководству

Если вы используете Mono, возможно, класс Contract пуст. Я этого не делал, но глава седьмая из руководства по контрактам, похоже, объясняет, как обеспечить собственную реализацию.

Ответ 2

Из Документы класса договора:

Внимание!

Вы должны установить надстройку Visual Studio для обеспечения выполнения контрактов. Код Контракт Premium Edition позволяет указать статичность и время выполнения проверка кодовых контрактов на странице свойств проекта. Если вы это сделаете не включать проверку времени выполнения, контракты, такие как Contract.Ensuresметод не будет генерировать исключения во время выполнения, если контракт нарушались. Надстройка Visual Studio не поставляется с Visual Studio 2010 или Windows SDK.

Ответ 3

С таким сообщением обычно полезно точно указать, что вы сделали.

Например, вы не указываете в исходном сообщении, если вы установили VS Addon, или что вы включили его под вашими свойствами проекта, или что вы фактически работаете в режиме отладки vs release и т.д.

Re Contract.Requires vs Contract.Requires<Exception>

Contract.Requires. Согласно руководству

Если ваш код должен выдать конкретное исключение при сбое в частности, предварительное условие, вы можете использовать общую перегруженную форму ниже. (Пожалуйста, прочтите раздел 5.1 перед тем, как перейти к этой форме в своем код. Вы не можете использовать Requires < Exn <Exn>> без запуска инструментов контракта на всех сборках. Если вы это сделаете, вы получите отказ во время выполнения каждый раз.)