【发布时间】:2010-05-06 10:46:45
【问题描述】:
我正在设计一种将元素添加到内部列表的方法。类的结构大致如下:
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;
}
这看起来很笨拙:(
代码契约应该旨在让事情变得更清晰,而这似乎恰恰相反。我做错了吗?
谢谢
【问题讨论】:
标签: c# .net c#-4.0 code-contracts