我正在设计一种将元素添加到内部列表的方法。类的结构大致如下:
class MyCustomerDatabase {
private IList<Customer> _customers = new List<Customer>();
public int NumberOfCustomers { get { return _customers; } }
public void AddCustomer(Customer customer) {
_customers.Add(customer);
}
}
现在,我正在考虑Contract.Ensures()
通过此调用添加大约 _customers 的大小增加 1。问题是我最终得到了一些看起来很奇怪的代码:
public void AddCustomer(Customer customer) {
int numberOfCustomersAtReturn;
Contract.Ensures(Contract.ValueAtReturn<int>(out numberOfCustomersAtReturn) ==
Contract.OldValue<int>(NumberOfCustomers) + 1);
_customers.Add(customer);
numberOfCustomersAtReturn = NumberOfCustomers;
}
Contract.ValueAtReturn()
主要问题是属性实际上是方法,所以当使用它的唯一参数接受变量时,你不能直接引用它们out
。如果我想达到同样的效果,情况会变得更加奇怪,但这次使用应该返回值的方法:
public int MyReturningMethod() {
...
return abc(); //abc will add by one the number of customers in list
}
//gets converted to
public int MyReturningMethod() {
int numberOfCustomersAtReturn;
Contract.Ensures(Contract.ValueAtReturn<int>(out numberOfCustomersAtReturn) == Contract.OldValue<int>(NumberOfCustomers) + 1);
int returnValue = abc();
numberOfCustomersAtReturn = NumberOfCustomers;
return returnValue;
}
这似乎很笨拙:(
代码合同应该旨在让事情变得更清晰,这似乎恰恰相反。难道我做错了什么?
谢谢