2012-01-30 5 views
11

Ранее я видел поток на StackOverflow, который обсуждал это, однако я не могу найти его снова!Использование System.Diagnostics.Contract in Release builds

Мне интересно узнать, следует ли использовать классы System.Diagnostics.Contract в «реальном коде», то есть в выпуске сборки производственного кода? Я прошу об этом, потому что, основываясь на описании пространства имен, это означает, что Контракт предназначен для отладки или анализа.

Похоже, что это полезная библиотека, где важны условия до/после работы для функциональности, и может избежать некоторых попыток написать много проверок if/then/else, поэтому, если это так, есть альтернатива в основные библиотеки?

+1

Пожалуйста, не прикрепите свои заголовки к «C#» и тому подобное. Для этого нужны теги. –

ответ

11

Раздел 5.1 (Довод проверки и контракты) о documentation детализирует три основных режима использования вы можете рассмотреть для использования контрактов:

  1. Довод проверки с помощью контрактов только в отладочной версии, а не в релиз сборки.
  2. Проверка также в выпусках.
  3. Пользовательская проверка аргументов в версиях выпуска, Контракты только в сборках отладки.

Таким образом, существует хотя бы один режим использования, в котором вы должны использовать Контракты в сборках выпусков, по крайней мере, в качестве официальной документации.

Цитата:

Перед тем, как начать использовать контракты в вашем собственном коде, вам нужно сделать несколько решений, которые влияют на то, что формы контрактов использовать для аргумента проверки и где (рисунок 2). Обратите внимание, что вы можете принимать эти решения самостоятельно для каждой управляемой сборки, которую вы производите (каждый проект):

Проще всего использовать инструменты контракта, если вы решите, что вам не нужно выполнять проверку аргументов во время выполнения в версиях сборки (Использование 1). В этом случае вы используете инструменты контракта во время разработки, но не на отгруженных битах. Помните, что вы можете отправить ссылочную сборку контракта вместе с вашими разрядными битами, чтобы клиенты могли проверять время выполнения проверки параметров на своих сборках отладки через call-сайт, требующие проверки.

Второй простой подход, если вам нужна проверка аргументов в вашей версии сборки, заключается в том, чтобы включить проверку контрактов во всех сборках (использование 2). Поэтому вы используете инструменты для создания строк времени выполнения ваших условий и для выполнения наследования контракта для вас. Вы можете выбрать конкретные исключения для проверки параметров или иметь стандартное исключение ContractException. Риск использования инструментов контракта в вашей версии сборки заключается в том, что вы зависите от инструментов, которые не достигли уровня качества продукции.

Самая сложная комбинация - это когда вы хотите проверить аргументы в сборках релизов, но вы используете инструмент контракта для проверки выполнения только в сборках отладки, но не в сборке выпуска (использование 3). В этом случае вы должны продолжить запись своей аргументации так, как вы уже это сделали, а именно с помощью команд if-then-throw (мы называем их устаревшими). Если вы хотите, чтобы они были доступны для поиска, добавьте другие контракты (например, «Гарантии») после них или используйте Contract.EndContractBlock(), если нет других контрактов. Обратите внимание: поскольку вы не используете инструменты проверки выполнения во время сборки сборки, вы не получите никакого наследования контрактов, и вам придется вручную повторить свое наследие - требует переопределений и реализации интерфейса.Для интерфейса и абстрактных методов вы все равно получаете наибольшее значение, если вы пишете контрактные классы с нормальными требованиями и обеспечиваете формы, чтобы вы могли проверять свои сборки отладки, и они появляются в сборках ссылок на контракт и, таким образом, отображаются зависимыми проектами и статическими шашками.

Это также указывает на то, что альтернативой, использующей только другие части структуры, было бы: Обычный способ использования if-then-throw.

Смежные вопросы