代码协定(二)前置条件

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















本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/497745 ,如需转载请自行联系原作者



相关文章
|
8月前
|
API
api一键自动合约跟单模式 | 程序化交易系统开发讲解【附样板源码实例分析】
“量化交易”有着两层含义:一是从狭义上来讲,是指量化交易的内容,将交易条件转变成为程序,自动下单;二是从广义上来讲,是指系统交易方法,就是一个整合的交易系统。
|
11月前
修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #80
修饰类属性失败。请确保提案类属性已启用并设置为使用松散模式。要在规范模式下将提案类属性与修饰器一起使用,请在阶段 2 中等待下一个主要版本的装饰器。 #80
32 0
|
测试技术
测试思想-流程规范 用例优先级定义与使用规范 V1.0
测试思想-流程规范 用例优先级定义与使用规范 V1.0
101 0
|
XML 前端开发 Dubbo
优雅的参数校验与全局异常-代码规范的天生落地
代码规范是项目质量的基石,能够帮助开发者和管理者更好的管理/维护项目、专注于推动快速成长的业务、留出更多时间攻坚重难点系统设计。而全局异常和参数校验则是快速开发的利器,本文将结合阿里巴巴开发手册阐述如何定义众所周知的全局异常机制。
683 0
优雅的参数校验与全局异常-代码规范的天生落地
|
XML 前端开发 安全
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
128 0
【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)
|
测试技术
接口测试平台插播: 同名字段请求体-其他涉及代码
我们上节课,成功的把单接口调试的底层请求代码中form-data等格式的请求体从字典转变为了多元元组,实现了同名字段的正常请求。本节就来搞定首页请求/用例请求/异常测试/登陆态的底层代码。
接口测试平台插播: 同名字段请求体-其他涉及代码
|
监控 视频直播
接口规范 12. 自动删除相关接口
12 自动删除相关接口 12.1.查询自动删除任务 用途查询服务器上的自动删除任务。自动删除任务是一种运行在服务器上的服务,按照定义的规则自动删除过期的视频内容。例如,对于监控和视频直播类业务,可以定义一个任务,定期删除某个直播流30天前的录制内容。
986 0