Контракты Microsoft Code , которые являются частью .NET Framework начиная с версии 4.0 CTP и доступны для более ранних версий .NET Framework в виде отдельного пакета, позволяют указывать предположения кодирования. Это включает в себя указание предварительных условий, которые могут проверять параметры.
Примером использования для проверки параметров будет (скопировано из Документация по контрактам ):
public Rational(int numerator, int denominator)
{
Contract.Requires(denominator ! = 0);
this.numerator = numerator;
this.denominator = denominator;
}
Преимущество использования Code Contracts заключается в том, что это библиотека, которая будет частью будущих выпусков .NET Framework, поэтому рано или поздно у вас будет на одну зависимость меньше в вашем приложении.
РЕДАКТИРОВАТЬ: Только что заметил, что вы специально запрашиваете библиотеку, которая использует атрибуты для проверки аргументов ... что Code Contracts этого не делает. Причина, по которой Code Contracts не использует атрибуты, указана в их FAQ :
Преимущество использования пользовательских атрибутов заключается в том, что они вообще не влияют на код. Однако преимущества использования вызовов методов намного перевешивают кажущийся естественным первый выбор атрибутов:
Поддержка времени выполнения: Независимо от бинарного переписывания, контракты, выраженные с помощью атрибутов, не могут быть принудительно применены во время выполнения. Это означает, что если существуют предварительные условия (или другие контракты), которые вы хотите принудительно применять во время выполнения, вам необходимо либо дублировать контракты в коде, либо включить в процесс сборки двоичный код. Contract.RequiresAlways служит как декларативным контрактом, так и проверкой во время выполнения.
Необходимость анализа: Поскольку значения, которые можно использовать с пользовательскими атрибутами, ограничены, условия в конечном итоге кодируются как строки. Это требует определения нового языка, который подходит для всех исходных языков, требует анализа строк, дублирующих все функциональные возможности, которыми уже обладает компилятор.
Отсутствие поддержки IDE: Выражается в виде строк, нет поддержки Intellisense, проверки типов или рефакторинга, все из которых доступны для создания договоров в виде кода.