Tôi có thông số IEnumerable
bắt buộc không trống. Nếu có điều kiện tiên quyết như dưới đây thì bộ sưu tập sẽ được liệt kê trong đó. Nhưng nó sẽ được liệt kê lại lần sau khi tôi tham khảo nó. (A "nhiều liệt kê có thể có của IEnumerable" cảnh báo trong Resharper.)Tổng số đếm liệt kê có thể đếm được do điều kiện tiên quyết hợp đồng
void ProcessOrders(IEnumerable<int> orderIds)
{
Contract.Requires((orderIds != null) && orderIds.Any()); // enumerates the collection
// BAD: collection enumerated again
foreach (var i in orderIds) { /* ... */ }
}
Những cách giải quyết làm Resharper hạnh phúc nhưng sẽ không biên dịch:
// enumerating before the precondition causes error "Malformed contract. Found Requires
orderIds = orderIds.ToList();
Contract.Requires((orderIds != null) && orderIds.Any());
---
// enumerating during the precondition causes the same error
Contract.Requires((orderIds != null) && (orderIds = orderIds.ToList()).Any());
Có cách giải quyết khác mà có thể có giá trị nhưng có lẽ không luôn luôn lý tưởng như sử dụng ICollection hoặc IList, hoặc thực hiện một điển hình if-null-throw-exception.
Có giải pháp nào hoạt động với hợp đồng mã và IEnumerables như trong ví dụ ban đầu không? Nếu không thì ai đó đã phát triển một mô hình tốt để làm việc xung quanh nó?
Tôi nghĩ rằng nó có thể chỉ là một ý tưởng tồi để có một hợp đồng phụ thuộc vào một IEnumerable - như IEnumerables theo định nghĩa có thể phải chịu tác dụng phụ. –
Cho đến nay tôi đã sử dụng ICollection như một giải pháp thay thế và không bao giờ có vấn đề, mặc dù tôi tò mò nếu có giải pháp cho IEnumerables. – Keith