2013-07-24 31 views
5

Tôi đã thử các mã sau đây để cho phép một số loại kiểm tra không null cho các đơn vị lấy ra để đảm bảo chúng tồn tại trước khi thực hiện một số doanh nghiệp cụ thể:CodeContracts "Yêu cầu" hiểu

protected T GetRequired<T>(object id) 
    where T : EntityObject 
{ 
    var obj = Get<T>(id); 
    Contract.Requires<ArgumentNullException>(obj != null); 
    return obj; 
} 

Nhưng trong thời gian biên dịch Tôi nhận được :
After contract block, found use of local variable 'obj' defined in contract block

Tôi có sử dụng Contract.Requires không đúng cách không?

Trả lời

6

Tôi có sử dụng Contract.Requires không đúng cách không?

Có, bạn đang có. Contract.Requires là về việc nêu rõ các điều kiện tiên quyết điều kiện tiên quyết cho một phương thức (hoặc thuộc tính). Đây là những điều kiện mà phải là đúng cho lời gọi phương thức để tiếp tục, nếu không bạn có vi phạm hợp đồng.

Chúng ta hãy nhìn vào mã của bạn:

var obj = Get<T>(id); 
Contract.Requires<ArgumentNullException>(obj != null); 

Ở đây, bạn có cố gắng sử dụng nó để đảm bảo rằng cái gì là đúng sau một phương pháp đã hoàn tất thi công (trong trường hợp này, các Get phương pháp). Đó sẽ là một hậu và cho rằng bạn sẽ sử dụng Contract.Ensures trong cơ thể của Get:

protected T Get<T>(object id) { 
    Contract.Ensures(Contract.Results<T>() != null); 
    // get and return result 
} 

Cuối cùng, điều này lỗi biên dịch

Sau khối hợp đồng, phát hiện sử dụng các biến địa phương obj quy định tại hợp đồng khối

Thư này là kết quả của việc bạn không thể sử dụng Contract giây sau khối hợp đồng điện tử và khối hợp đồng xuất hiện ở đầu phần thân của phương thức chỉ.

3

Có vẻ như bạn đang cố gắng làm một vài điều cùng một lúc ở đây:

Contract.Requires nên được sử dụng trên các thông số đầu vào trực tiếp, ví dụ nếu id không bao giờ nên được null, sau đó làm như vậy:

Contract.Requires<ArgumentNullException>(id != null); 

Bên cạnh đó, có vẻ như bạn muốn đảm bảo rằng kết quả là không null. Làm như vậy:

Contract.Ensures(obj != null); 

Tương tự, bạn có thể kiểm tra hợp đồng bổ sung bằng phương pháp trợ giúp (Get).

Các vấn đề liên quan