2011-12-04 15 views

Trả lời

3

Tôi đã không thử nó bản thân mình, nhưng according to the MSDNContract.OldValue có thể giúp kiểm tra xem một giá trị tài sản duy nhất không thay đổi:

public bool IsValid 
{ 
    get 
    { 
    ... 
    } 
} 

public void SomeMethod() 
{ 
    Contract.Ensures(this.IsValid == Contract.OldValue(this.IsValid)); 
    ... 
} 
+0

Tuyệt vời, cảm ơn. Nó hoạt động. –

1

Không, tiếc là C# không cung cấp logic lôgic C++ như vậy.

1

Cách duy nhất để thực hiện việc này là kiểm soát mã của bạn theo cách mà bạn biết rằng mã sẽ không thay đổi. Không có mã hoặc cú pháp cụ thể để kiểm soát điều này nếu không (như trong C++).

5

Vì mục đích đó, thuộc tính [Pure] đã được thêm vào không gian tên System.Diagnostic.Contracts. Xem here để được giải thích thêm. Tuy nhiên, bạn không thể ngăn chặn một thuộc tính duy nhất bị thay đổi. Phương thức này không được phép thay đổi trạng thái đối tượng ở tất cả (giống như const C++).

EDIT: Thật không may thuộc tính Pure không hoạt động với các công cụ hiện tại. Tôi thực hiện một thử nghiệm với đoạn mã sau, không có thông báo lỗi hoặc ở tĩnh cũng không ít kiểm tra kiểu thời gian chạy:

public class Test 
{ 
    private int x = 0; 

    [Pure] 
    public void Foo() 
    { 
     x++; 
    } 
} 

Về tài liệu của Pure kiểm tra sẽ được hỗ trợ trong tương lai '. Bất cứ khi nào đó là ("Nhóm Hợp đồng Mã đang làm việc nặng nề trên đó, do đó để đưa ra một kiểm tra độ tinh khiết trong một bản phát hành trong tương lai.").

Tôi đã sử dụng thuộc tính trong tin rằng nó hoạt động bình thường. Tài liệu nói rằng tất cả các phương thức được gọi trong một hợp đồng phải được khai báo là thuần túy. Nó không nói rằng đó là kiểm tra hay không.

Vì vậy, câu trả lời cho câu hỏi của bạn là: Hiện tại không có hỗ trợ nào cho điều này, nhưng có thể trong tương lai.

+4

tôi sắp sửa đưa ra điều tương tự, nhưng đã quyết định để kiểm tra MSDN. Một điều liên quan đến tôi: "Thuộc tính này không được thực thi bởi các công cụ phân tích hiện tại, bạn nên sử dụng thuộc tính này chỉ khi bạn chắc chắn rằng các phương thức là thuần túy." tại http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.pureattribute.aspx. Tôi sẽ kiểm tra nhanh nếu đó là vấn đề hay không. – ViktorZ

+0

Đã xác nhận - PureAttribute không tạo ra cảnh báo hoặc lỗi trong trình phân tích hợp đồng mã trong áp dụng cho một phương thức thay đổi trạng thái đối tượng. Thử nghiệm cả với thời gian chạy và kiểm tra tĩnh. Vì vậy, không có cách nào để sử dụng Hợp đồng Mã cho trường hợp này – ViktorZ

+0

Đó là một điểm thú vị, tôi cũng xác nhận nó! Vì vậy, microsoft thực hiện và ghi lại một thuộc tính không sử dụng thực tế. Đó là xấu – slfan

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