Последний зрелый ответ на это был в 2009 году, и .NET 4 вышел. Я полагаю, что мы должны для обновления:
Кодовые контракты вполне могут быть достаточно зрелыми для ваших релизов Debug.
Я понимаю, что это что-то вроде перехода с «Безвредного» на «В основном безвредный».
Домашняя страница Code Contracts содержит ссылки на довольно подробную документацию в формате PDF. В документации изложены рекомендации по использованию в разделе 5. Подводя итог, вы можете выбрать, насколько смело вы чувствуете в отношении инструментов контракта, переписывающих ваш IL в ваших сборках Release.
Мы используем режим «не переписывать мой Release IL».
Пока что мне больше всего нравится это неожиданное преимущество: кода меньше, а значит, меньше кода для тестирования . Все ваши пункты охраны растают.
if(arg != null) {
throw new ArgumentNullException("arg");
}
// Blank line here insisted upon by StyleCop
становится:
Contract.Requires(arg != null);
Ваши функции короче. Ваше намерение яснее. И вам больше не нужно писать тест с именем ArgumentShouldNotBeNull только для того, чтобы достичь 100% покрытия.
Пока что я столкнулся с двумя проблемами:
У меня был модульный тест, который основывался на провале контракта. Вы можете утверждать, что существование теста было ошибкой, но я хотел задокументировать этот конкретный запрет в форме теста. Тест не прошел на моем сервере сборки, потому что у меня не было установленных инструментов. Решение: установите инструменты.
Мы используем два инструмента, которые переписывают IL: Кодовые контракты и PostSharp . Они не ладили слишком хорошо. PostSharp 2.0.8.1283 исправил проблему. Однако я бы осторожно оценил, как уживаются любые два инструмента переписывания IL.
Пока что преимущества перевешивают опасности.
Устранение устаревших проблем, поднятых в других ответах:
- Документация Code Contracts довольно полная, хотя, к сожалению, в формате PDF.
- Существует по крайней мере один форум по контракту , организованный Microsoft.
- Code Contracts Standard Edition предоставляется бесплатно, если у вас есть лицензия VS2010.
- .NET 4 вышел. Я столкнулся с контрактами Microsoft при реализации универсальных интерфейсов сбора.