Подтвердить что ты не робот

Кодовые контракты во время выполнения

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

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

4b9b3361

Ответ 1

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

Ответ 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 и снимите отметку с проверки времени выполнения.