代码协定(二)前置条件

 

前置条件用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会把这样的组合当成一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值