1.背景
学习以及研究协定Contract
2.代码
(1)接口代码
[ContractClass(typeof(PersonContract))]
public interface IPerson
{
string FirstName { get; set; }
string LastName { get;set; }
int Age { get;set; }
void ChangeName (string firstName,string lastName );
}
(2)协定规则代码(对接口成员变量进行协定限制)
[ContractClassFor(typeof(IPerson))]
public abstract class PersonContract:IPerson
{
string IPerson.FirstName
{
get { return Contract.Result<string>(); }
set { Contract.Requires(value != null); }
}
string IPerson.LastName
{
get { return Contract.Result<string>(); }
set { Contract.Requires(value != null); }
}
int IPerson.Age
{
get
{
Contract.Ensures(Contract.Result<int>()>=0 &&
Contract.Result<int>() < 121);
return Contract.Result<int>();
}
set
{
Contract.Requires(value >= 0 && value<123);
}
(3)接口实现类代码
public class Person:IPerson
{
public Person(string firstName,string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age {get; set;}
public void ChangeName(string firstName, string lastName)
{
this.FirstName = firstName;
this.LastName = lastName;
}
}
(4)新建对象,测试并使用
Person pe=new Person("111",null)
可以发现,定义好的规则并未生效。经查找,需要安装插件,并设置项目属性,具体细节见https://www.cnblogs.com/TBW-Superhero/p/7151085.html
(5)在正确设置后,再次测试调用 var pp = new Person("132", null);
可发现,该新建对象失败,进入异常,异常信息为:
“System.Diagnostics.Contracts.__ContractsRuntime.ContractException”类型的未经处理的异常在 xxxx.exe 中发生“”
“其他信息: 前置条件失败: value != null”
至此,正确的设置了协定并成功起效。