前置条件用Contract.Requires方法。前置条件一般是在方法被调用时执行,一般是用来验证方法的参数是否符合业务逻辑,如果使用方法的参数,必须在Contract.Requires方法之后(因为这个方法是前置条件吗!);并且,在使用Contract.Requires方法中用到的变量,必须和Contract.Requires所在的方法的访问修饰符相统一。
下面是一个正确的前置条件,Requires中的参数是来自方法SetAge的参数。
class Employee
    {
        int age;
        public void SetAge(int age)
        {
            Contract.Requires(age > 0 && age < 150);
            this.age = age;
        }
    }
如果把Requires中的参数换成this.age,代码如下:
class Employee
    {
        int age;
        public void SetAge(int age)
        {
            Contract.Requires(this.age > 0 && this.age < 150);
            this.age = age;
        }
    }
系统将要报如下错误:“错误       1       Member 'ConsoleApplication6.Employee.age' has less visibility than the enclosing method '…Employee.SetAge(System.Int32)'.       …”,因为this.age的访问修饰符是private,而方法是public的。
具体前置条件参数访问修饰符和方法访问修饰符如下:
     Requires参数
        访问修饰符
Requires          所在方法访
问修饰符
public
internal
protected
private
public
internal
protected
private
Contract.Requires还有一个重载方法,第二个参数为string类型,作用是如果没满足协定后报异常的提示信息。
对于Contract.Requires,还有一个泛型的方法Contract.Requires<T>,参数类型和作用,与Requires一样,所区别的是,Contract.Requires<T>中的 T,必需是继承Exception,当然可以设计成自定义异常类,代码如下:
 class MyException : Exception
    {
        public MyException(string message)
            : base(message)
        { }
    }
    class Employee
    {
        int age;
        public void SetAge(int age)
        {           
            Contract.Requires<MyException>(age > 0 && age < 150,"自定义异常!");
            this.age = age;
        }
}
但这个方法只能把“项目”-“项目属性”-“Code Contracts”下的“Assembly Mode”选项设置成“Standard Contract Requires”时才生效。如果选项设成“Custom Parameter Validation”,则会报编译错误。

Contract.EndContractBlock方法,作为前置条件的结束,所有前置条件可以写在这个语句的前面,但不能写在这行语句后面。因为这个方法表示前置条件的结束,后面不能有前置条件了。如果在Contract.EndContractBlock前面出现了一个if语句,并且if语句里有throw语句,Contract.EndContractBlock会把这样的组合当成一个