Кодовые контракты во время выполнения
Насколько я читал в двух словах, кодовые контракты могут ухудшить производительность выполнения.
Можно ли отключить кодовые контракты в процессе производства?
Ответы
Ответ 2
У меня есть мои любимые опции, описанные в моем блоге.
Подводя итог:
- В режиме деблокирования я рекомендую снять флажок "Выполнять проверку выполнения времени выполнения", но выберите "Создать сборку контрактных ссылок". Это поместит Preconditions в отдельную dll, которую ваши клиенты могут использовать (если они проверяют Call-site Requires Checking), но удаляет все служебные данные, если они не проверяют эту опцию.
- В режиме отладки установите для параметра "Выполнение проверки выполнения времени выполнения" значение "Полный".
Некоторые люди предпочитают предустановления, которые должны быть включены в их сборку выпуска. Это особенно полезно при распространении через NuGet, потому что они не поддерживают dll dll Code Contract. Для моих пакетов NuGet я перехожу к включению Preconditions в сборках Release, но также имеет отдельную загрузку для сборки "Release without Preconditions".
Ответ 3
Разница в производительности довольно мала и не влияет на ваш код заметным образом. Если вы не разрабатываете какую-либо систему торговли акциями в реальном времени, я серьезно даже не буду об этом беспокоиться.
Что касается отключения кода в разделе "Производство", я бы скорее добавил дополнительную защиту кодовых контрактов вместо некоторой, возможно, неясной ошибки. Ошибка в кодовом контракте скажет вам, где и почему был нарушен Контракт, а не копать в некотором глубоком стеке вызовов только потому, что некоторые плохие данные были переданы на 5 уровнях вверх по дереву стека вызовов.
@svanryckeghem и @Stephen Cleary:
Если вы используете или планируете использовать Contract.Requires<TException>
и не включаете "Проверка выполнения времени выполнения", вы получите отказ во время выполнения сценария IL (ccrewrite.exe), связанный с использованием Code Contracts. Затем вам понадобится включить проверку срочного контракта, чтобы заставить это работать.
IMHO, использование Contract.Requires<TException>()
гораздо более полезно, чем Contract.Requires()
, поскольку вы контролируете тип созданного исключения.
Ответ 4
В свойствах проекта перейдите в Code Contract, выберите "Release" Configuration и снимите отметку с проверки времени выполнения.