2009-08-09 14 views
5

Tôi chỉ rối tung xung quanh để trả lời câu hỏi của một ai đó ở đây trên Stack Overflow, khi tôi nhận thấy một cảnh báo xác minh tĩnh từ bên trong Visual Studio của tôi (2008):Hợp đồng mã .NET: nó có thể cơ bản hơn thế này không?

string[] source = { "1", "A", "B" }; 
var sourceObjects = Array.ConvertAll(source, c => new Source(c)).ToArray(); 

Tôi nhận được thông báo đòi hỏi nguồn chưa được chứng minh! = null. Nó có vẻ khá rõ ràng với tôi rằng đây không phải là trường hợp. Đây chỉ là một ví dụ của khóa học. Ở phía bên kia, một số công cụ khá tiện lợi dường như hoạt động khá tốt.

Tôi đang sử dụng bản phát hành 1.2.20518.12 (ngày 18 tháng 5). Tôi tìm thấy các hợp đồng mã rất thú vị, nhưng có ai khác có trường hợp như thế này không? Bạn có xem xét việc thực hiện hiện tại có thể sử dụng được trong thực tế hay bạn sẽ xem xét chúng hoàn toàn là học thuật vào thời điểm này?

Tôi đã thực hiện điều này một cộng đồng wiki, nhưng tôi muốn nghe một số ý kiến ​​:)

Trả lời

16

Nó làm cho ý nghĩa hơn nếu bạn chia hai cuộc gọi lên:

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
var sourceObjects = tmp.ToArray(); 

Bây giờ nó trỏ đến số dòng mới nhất là sự cố. Nói cách khác, lệnh gọi tới số Array.ConvertAll biết rằng nguồn không phải là null, nhưng cuộc gọi tới ToArray() không biết rằng tmp sẽ không bị vô hiệu.

(Ví dụ của bạn cũng hơi khó hiểu do việc sử dụng tên source trong mã nguồn của bạn - lỗi sẽ vẫn sử dụng source ngay cả khi bạn gọi biến của mình là gì đó hoàn toàn khác, vì nó đề cập đến tham số đầu tiên trong Enumerable.ToArray.)

Về cơ bản tôi tin rằng điều này tất cả sẽ hoạt động khi Array.ConvertAll nhận được một điều kiện vô điều kiện thích hợp. Cho đến lúc đó, điều này sẽ thực hiện thủ thuật:

string[] source = { "1", "A", "B" }; 
var tmp = Array.ConvertAll(source, c => new Source(c)); 
Contract.Assume(tmp != null); 
var sourceObjects = tmp.ToArray(); 

Tôi đồng ý rằng điều này thật khó chịu nhưng tôi chắc chắn sẽ cải thiện nhanh chóng khi MS thêm nhiều hợp đồng vào BCL. Điều quan trọng cần lưu ý rằng đó là không phải là sự cố với trình kiểm tra tĩnh.

(Trong thực tế, Array.ConvertAll không có một điều kiện tiên quyết hoặc - nếu bạn đặt biến source null trong đoạn mã thứ hai ở trên, nó vẫn sẽ không phàn nàn.)

+1

đã thông qua văn bản cho chương hợp đồng? :) –

+1

Gần đó, có :) Tôi đã rất ấn tượng bởi nó, phải trung thực. –

+1

Tôi chưa từng đi sâu vào công việc bên trong, nhưng làm thế nào là điều kiện tiên quyết và postconditions được định nghĩa cho các phương thức đã có trong các phiên bản hiện tại của thư viện lớp cơ sở? Tôi đoán họ chỉ cần bỏ bất cứ điều gì ccrewrite thường tạo ra trong phân phối? – Thorarin

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