Должен ли CodeContracts заменить обычные исключения ArgumentException? - PullRequest
3 голосов
/ 20 декабря 2010

Могу ли я начать использовать CodeContracts вместо:

if (XXX == Y)
    throw new ArgumentException("bla bla");

Как это работает, если я разрабатываю библиотеку, а пользователи моей библиотеки не используют CodeContracts?

Ответы [ 3 ]

2 голосов
/ 20 декабря 2010

Если предположить, что код, использующий контракты кода, выполняется через бинарный переписчик, он выдаст исключения, такие как код, который вы опубликовали. Переписчик проходит через код и заменяет код контракта проверкой аргументов и т. Д. Это похоже на аспектно-ориентированное программирование. Он вводит код для обработки ситуаций после того, как вы его скомпилировали.

Если они не используют кодовые контракты, они не получат преимущества от выполнения статического анализа, который предназначен для просмотра контракта и предупреждения, что они могут получить ошибку на основе контракта и их кода.

Кодовые контракты

1 голос
/ 20 декабря 2010

Кстати: можно написать такие утверждения, как это

Contract.Requires<ArgumentNullException>(argumentToCheck, "argumentToCheck");

Если вы включите средство проверки времени выполнения в конфигурации сборки, перезаписывающее устройство перезапишет подобные предварительные условия в обычное исключение ArgumentNullException.

Для вызывающих абонентов вашего кода будет показано исключение ArgumentNullException или любое другое предоставленное вами исключение, независимо от того, установлены ли у них кодовые контракты.

0 голосов
/ 20 декабря 2010

Я использую контракты кода и для случайного использования они решают 2 проблемы кода для меня, у которых раньше не было хороших решений:

  • проверка возвращаемых значений проверка
  • Инварианты, по-видимому, являются плохо названными комбинированными параметрами проверки / точки входа и значения возврата / точки выхода.

Я мог бы объявить временную переменную для возвращаемого значения и утверждать некоторые вещи, прежде чем вернуть его, но это дополнительное трение.

проверка параметров уже имела решение: бросить ArgumentException.

Кодовые контракты добавляют к ArgumentException одну крошечную вещь - она ​​заставляет вас проверять аргументы очень рано, что, на мой взгляд, является хорошей вещью.

С Code Contracts происходит гораздо больше, но я только что окунулся в это, и у меня нет редакции, которая выполняет супер-всеобъемлющие статические проверки. Я планирую перейти к использованию кодовых контрактов более полно, и как только я это сделаю, будет более элегантно проверять параметры, используя ту же платформу, вместо того, чтобы переключаться между кодовыми контрактами и обратно, если / then / throw ArgumentException

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...