2011-11-28 26 views
9

Giả sử tất cả mã .NET 4.0 mớiTôi có nên bật kiểm tra thời gian chạy các hợp đồng mã cho .NET 4.0 trên bản phát hành bản phát hành không?

Tôi thấy rằng có tùy chọn để bật chúng. Tuy nhiên tôi không thấy thực hành tốt nhất là gì? Có phải thực hành tốt nhất là khi kiểm tra tĩnh được thực hiện, bạn thực sự không cần phải kiểm tra thời gian chạy (vì trình biên dịch đảm bảo rằng các điều kiện được đáp ứng) không? Không. Hoặc là có kịch bản mà ngay cả khi trình biên dịch kiểm tra nó cho bạn, nó vẫn còn có thể là trong thời gian chạy điều kiện sẽ không được đáp ứng?

Mọi cuộc thảo luận hoặc bài viết trực tuyến hay về điều này. Tôi thấy nhiều giải thích làm thế nào để làm một trong hai nhưng không nhiều mà giải thích đó là thực hành tốt nhất giả sử tất cả các mã .NET 4.0 mới không có tính tương thích ngược cần thiết.

Trả lời

5

vì trình biên dịch đảm bảo rằng các điều kiện được đáp ứng?

Rất hiếm khi trình xác minh tĩnh tĩnh sẽ có thể xác minh toàn bộ ứng dụng. Chúng tôi thường sẽ giải quyết cho các bộ phận chính.

Tôi có nên bật kiểm tra thời gian chạy các hợp đồng mã cho .NET 4.0 trên bản phát hành bản phát hành không?

Có lẽ không phải là Full option, nhưng một trong những những người nhẹ hơn như điều kiện tiên quyết Chỉ.

Đối với mã quan trọng hiệu suất, bạn có thể muốn tắt hoàn toàn.

4

Tùy thuộc vào cách bạn sử dụng Yêu cầu.

Nếu bạn sử dụng 'Hợp đồng Tuỳ chỉnh Đòi hỏi' chế độ:

public void SomeMethod(SomeClass x) 
{ 
    if (x == null) throw new ArgumentNullException("x"); 
    Contract.EndContractBlock(); 

    ... 
} 

bạn có thể an toàn biến thời gian chạy kiểm tra hết, và giữ kiểm tra lỗi và ngoại lệ

Nếu bạn sử dụng của bạn 'hợp đồng yêu cầu chuẩn' chế độ:

public void SomeMethod(SomeClass x) 
{ 
    Contract.Requires<ArgumentNullException>(x != null); 

    ... 
} 

bạn nên bật kiểm tra thời gian chạy ở mức tối thiểu 'ReleaseRequires'. Nếu không, bạn sẽ mất tất cả các kiểm tra lỗi và có thể nhận được các ngoại lệ không mong muốn (ví dụ: NullReferenceException ở đâu đó sâu trong mã thay vì ArgumentNullException trên mặt công khai)

Tôi sẽ không sử dụng mức kiểm tra cao hơn vì một lý do rất đơn giản: hợp đồng khác ngoài Contract.Requires<E> không thành công, thời gian chạy sẽ ném một số System.Diagnostics.ContractException mà có thể sẽ không làm hài lòng người dùng.

BTW, Henk Holterman hoàn toàn đúng khi trình xác minh tĩnh bị giới hạn và bạn không nên dựa hoàn toàn vào nó.

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