Использование System.Diagnostics.Contract в релизе сборки

Ранее я видел поток в StackOverflow, который обсуждал это, но я не могу найти его снова!

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

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

Ответ 1

Раздел 5.1 (Подтверждение аргументов и контракты) документа подробно описывает три основных режима использования, которые вы можете использовать для использования Контрактов:

  • Подтверждение аргументов через Контракты только в сборках Debug, а не в сборках релизов.
  • Проверка также в версиях выпуска.
  • Пользовательская проверка аргументов в версиях выпуска, Контракты только в сборках Debug.

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

Цитата:

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

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

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

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

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