Договор. Требует использования - PullRequest
40 голосов
/ 28 ноября 2011

Вот моя проблема. Я очень большой поклонник дизайна по контракту, я использую эту концепцию, особенно при разработке библиотек, которые могут быть использованы другими разработчиками. Я только что нашел новый способ сделать это: 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)? 1032 *

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

Ответы [ 3 ]

25 голосов
/ 28 ноября 2011

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

  1. Установите надстройку Code Contracts, как отметил nfechner
  2. Перейти к свойствам проекта, папка «Контракты кода»
  3. Проверка «Выполнение проверки контракта во время выполнения»
  4. Переключить «Режим сборки» на «Стандартный контракт требует»
  5. Замените ваш Contract.Requires на Contract.Requires<SomeException> (первый выдает System.Diagnostics.ContractException, а второй выдает указанное вами исключение, что важно для открытых методов)

Это базовая настройка. Для более точной настройки см. Руководство

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

11 голосов
/ 28 ноября 2011

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

Важно

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

2 голосов
/ 28 ноября 2011

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

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

Re Contract.Requires против Contract.Requires<Exception>

Contract.Requires рекомендуется. Согласно инструкции

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

...