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