2010-05-06 39 views
9

Tôi chỉ mới bắt đầu tìm hiểu về thư viện hợp đồng mã có tiêu chuẩn với VS2010. Một điều tôi đang chạy ngay lập tức là những gì một số điều khoản hợp đồng thực sự có ý nghĩa.Contract.Exists thêm giá trị như thế nào?

Ví dụ: hai câu lệnh này khác nhau như thế nào?

Contract.Requires(!mycollection.Any(a => a.ID == newID)); 
Contract.Requires(!Contract.Exists(mycollection, a => a.ID == newID)); 

Nói cách khác, Contract.Exists làm gì trong thực tế, cho nhà phát triển sử dụng chức năng của tôi hoặc cho hệ thống phân tích mã tĩnh?

+0

@Chris Pebble, các cuộc trò chuyện trùng lặp có thể có về sự khác biệt giữa List.Exists với IEnumerable.Any. Điều này liên quan đến Contract.Exists - đó là một ngữ cảnh khác. – Elisha

+0

Điểm tốt. Tha thứ sai lầm. –

Trả lời

1

Ok, tôi đã tìm thấy câu trả lời. Theo Hướng dẫn sử dụng hợp đồng mã, phần 2.7.2:

"Cũng có thể sử dụng phương pháp mở rộng System.Linq.Enumerable.Any thay vì Contract.Exists".

Vì vậy, chúng tương đương nhau. Tôi sẽ sử dụng bất kỳ thay vì tồn tại, vì vậy nó phù hợp với phần còn lại của mã của chúng tôi.

4

Phiên bản sử dụng Contract.Exists được ưu tiên do tính chất khai báo của nó. Một ưu điểm nữa là khung công tác biết hợp đồng này và nó có cơ hội tốt hơn bị "bắt" trong phân tích tĩnh.

+0

Bạn có thể xây dựng ý nghĩa của mình bằng cách "ưa thích do tính chất khai báo của nó" không? Ngoài ra, phân tích tĩnh có thực sự hoạt động với các đại biểu không? Tôi hy vọng rằng thực tế bạn có thể đặt mã tùy ý vào lambda đó sẽ vô hiệu hóa bất kỳ phân tích tĩnh nào có thể. – scobi

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