概述
前置条件用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会把这样的组合当成一个
最后
以上就是尊敬大米为你收集整理的代码协定(二)前置条件的全部内容,希望文章能够帮你解决代码协定(二)前置条件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复