Как отменить определение символа CONTRACTS_FULL?

Visual Studio автоматически определяет символ CONTRACTS_FULL, если вы включаете проверку контрактов на вкладке Code Contracts страницы Project Properties.

- C# 5.0 в двух словах (стр. 518)

Я хотел бы отключить/отменить определение символа, но он не отображается в поле Conditional compilation symbols на вкладке Build в настройках проекта.

(Я не заинтересован в полном отключении кодовых контрактов! Под этим я просто подразумеваю, что установка проверки контракта на None не является решением).

Если это имеет значение, причина, по которой я хочу это сделать, заключается в том, что в моих релизных сборках я хочу выбрасывать только Contract.Requires<TException> и вообще не хочу выбрасывать ContractException.

Одно «решение», которое я нашел, состоит в том, чтобы поместить #undef CONTRACTS_FULL в первую строку каждого файла, это исправило это, но на самом деле это было бы ужасно.

(Кстати, до сих пор VS не определял CONTRACTS_FULL, и мне пришлось определить его самому, но я предполагаю, что некоторые настройки были изменены случайно)


person MasterMastic    schedule 02.03.2013    source источник


Ответы (2)


Вы не можете запустить инструменты контракта и отменить определение символа CONTRACTS_FULL. Инструменты зависят от того, что определяется. Ничего не получится, если вы попытаетесь заставить это. Вот почему мы автоматически определяем символ внутри скриптов msbuild.

Пользователи инструментов Code Contract никогда не должны пытаться вручную определить или отменить определение символа CONTRACTS_FULL, так как это переменная, управляемая инструментом.

person Manuel Fahndrich    schedule 25.04.2013
comment
Таким образом, нет возможности генерировать только Requires<TException> исключения и никогда ContractException? - person MasterMastic; 25.04.2013
comment
@Ken Ну, если вы используете только контракты Requires‹TException› и запускаете переписчик, то да, вы никогда не получите ContractExceptions. Другой способ получить это — установить уровень проверки во время выполнения на ReleaseRequires. - person Manuel Fahndrich; 25.04.2013

Я читал эту книгу, и там БЫЛ уровень контракта, который использовал только Contract.Requires. Это был вариант, прежде чем ничего там не было, но он определенно где-то в этом разделе книги. Однако я не могу помочь вам с глобальной отменой определения CONTRACTS_FULL. Извиняюсь. Однако я думаю, что на этом уровне проверки контракта он автоматически не определяется.

РЕДАКТИРОВАТЬ: Да, вам нужно поставить его на первый уровень (ReleaseRequired).

person It'sNotALie.    schedule 02.03.2013