内部リストに要素を追加するメソッドを設計しています。クラスの構造は、次のようなものです。
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;
}
これはかなり不器用なようです:(
コードコントラクトは物事をより明確にすることを目的とすべきであり、これは正反対のようです。私は何か間違ったことをしていますか?
ありがとう