Кодовые контракты во время выполнения - PullRequest
19 голосов
/ 14 июля 2011

Насколько я читал в двух словах, контракты с кодами могут ухудшить производительность во время выполнения.

Можно ли отключить кодовые контракты в производстве?

Ответы [ 4 ]

32 голосов
/ 14 июля 2011

В руководстве пользователя это объясняется довольно подробно - есть все возможные варианты. Каждая конфигурация сборки может иметь различные параметры, для которых контракты проверяются во время выполнения, и это не выбор «все или ничего» - вы можете принудительно применить все, некоторые или ни один из контрактов на основе параметров, которые можно настроить в Visual Studio.

12 голосов
/ 14 июля 2011

Мои любимые варианты описаны в моем блоге .

Подведем итог:

  • В режиме деблокирования я рекомендую снять флажок Выполнить проверку контракта во время выполнения, но выбрать Построить ссылочную сборку контракта. Это поместит Предварительные условия в отдельную dll, которую ваши клиенты могут по желанию использовать (если они проверяют Call-site требует проверки), но удаляет все накладные расходы, если они не проверяют эту опцию.
  • В режиме отладки установите для параметра «Выполнить проверку контракта во время выполнения» значение «Полный».

Некоторые люди предпочитают, чтобы предварительные условия были включены в их сборку выпуска. Это особенно полезно при распространении через NuGet, потому что они не поддерживают кодовый контракт dll . Что касается моих пакетов NuGet, я перехожу к включению Предварительных условий в сборки выпуска, но также имею отдельную загрузку для сборки "Выпуска без предварительных условий".

7 голосов
/ 30 ноября 2012

Разница в производительности довольно мала и не окажет заметного влияния на ваш код. Если вы не разрабатываете какую-либо систему торговли акциями в реальном времени, я бы даже не стал беспокоиться об этом.

Что касается отключения кода в Production, я бы предпочел иметь дополнительную защиту контрактов кода вместо какой-то неясной ошибки. Ошибка в контракте кода скажет вам точно, где и почему был нарушен Контракт, в отличие от необходимости копаться в некотором глубоком стеке вызовов только потому, что некоторые неверные данные были переданы на 5 уровнях вверх по дереву стека вызовов.

@ svanryckeghem и @Stephen Cleary: Если вы используете или планируете использовать Contract.Requires<TException> и не включаете «Проверка контракта времени выполнения», вы получите ошибку времени выполнения из-за того, что программа перезаписи IL (ccrewrite.exe) должна быть связана с использованием контрактов кода. Затем вам нужно будет включить проверку выполнения контракта, чтобы заставить это работать.

ИМХО, использование Contract.Requires<TException>() гораздо полезнее, чем Contract.Requires(), поскольку вы можете контролировать тип создаваемого исключения.

4 голосов
/ 14 июля 2011

В свойствах вашего проекта перейдите в Code Contract, выберите конфигурацию «Release» и снимите флажок проверки во время выполнения.

...