Как установить и использовать кодовые контракты?
У меня есть основной вопрос, может быть, это так очевидно, но по какой-то причине я не могу показаться успешным при установке и использовании кодовых контрактов.
Я загрузил пакет из MSDN, установил его после онлайн-документации, но я все еще получаю предупреждение IDE для приведенного ниже кода:
Contract.Requires(inputParameter != "");
предупреждение IDE:
"Вызов метода пропускается. Компилятор не будет генерировать вызов метода, потому что метод является условным, или это частичный метод без реализации"
Все, что мне не хватает в процессе создания кодовых контрактов? Я использую VS2010 Ultimate SP1
Ответы
Ответ 1
Скорее всего, это связано с тем, что Контрактные коды не настроены в настройках проекта. Если вы перейдете к своим свойствам проекта, вы увидите вкладку "Кодовые контракты". На вкладке выберите режим, в котором вы строите (Debug | Release | Both), а затем включите функции Code Contracts, установив соответствующие флажки.
Я видел предупреждение о том, что вы подробно указываете, когда Code Contracts не установлены на Build
.
Если вы не видите вкладку "Контракты кода", вам может потребоваться установить Кодовые контракты на вашем компьютере. Сделайте это, загрузив и установив установщик из здесь.
Ответ 2
Условная компиляция основана на определениях препроцессора компилятора. Это тот же подход, который используется для константы DEBUG
, хотя Visual Studio скрывает определение того, что находится за флажком. Это эффективный подход, поскольку, когда эти символы не определены, методы вообще не вызываются; важно, чтобы передаваемые параметры также не оценивались, поэтому вы можете использовать относительно дорогие проверки в ваших контрактах с кодом, не беспокоясь о том, что эти проверки замедляют выпуск сборок.
Введение Microsoft в кодовые контракты говорит следующее:
Большинство методов в классе контракта условно скомпилированы; то есть компилятор выдает вызовы этим методам только тогда, когда вы определяете специальный символ CONTRACTS_FULL, используя директиву #define. CONTRACTS_FULL позволяет писать контракты в коде без использования директив #ifdef; вы можете создавать различные сборки, некоторые с контрактами, а некоторые без них.
Хотя это говорит об использовании #define
в коде для включения кодовых контрактов:
#define CONTRACTS_FULL
как @NirMH сказал в комментариях, как правило, лучше определить его в условных символах компиляции для проекта, чтобы вы могли использовать его для некоторых сборок и отключать для других.
![Условные настройки компиляции]()
Обратите внимание, что CONTRACTS_FULL
- единственный вариант, который у вас есть, хотя он явно назван так, чтобы в будущем возможность более детального контроля.