2011-08-29 32 views
13

Có một thực hành tốt để sử dụng IEnumerable ứng dụng rộng bất cứ khi nào bạn không cần phải thực sự thêm hoặc loại bỏ thứ nhưng chỉ liệt kê chúng?IEnumerable & Thực hành tốt (& WCF)

Câu hỏi phụ: Bạn có gặp bất kỳ sự cố nào khi trả lại IEnumerable<T> từ dịch vụ WCF không? Điều đó có thể gây ra sự cố cho ứng dụng của khách hàng không? Sau khi tất cả, tôi nghĩ rằng sẽ được serialized vào một mảng.

+1

Có lẽ bạn nên thêm ngôn ngữ bạn đang nói đến? Đây không phải là trang web chỉ dành cho mạng. Sau tất cả ... –

+0

Bạn đã đúng. Cảm ơn. – User

+2

Mặc dù đây không phải là bản sao chính xác **, nhưng tôi vẫn khuyên bạn nên xem câu hỏi này: http://stackoverflow.com/questions/1072614/should-i-always-return-ienumerablet-instead-of -ilistt – yas4891

Trả lời

1

Tôi không có bất kỳ nguồn Thực tiễn tốt nào, nhưng tôi thường có xu hướng dựa vào Danh sách cho bộ sưu tập của mình và triển khai IEnumerable nhưng tôi chuyển nó thành Danh sách chứ không phải IEnumerable, nếu tôi cần đọc chỉ tôi thay vì vượt qua một ReadOnlyCollection ..

1

Tôi không muốn trả lại hoặc chấp nhận IList<T> hoặc List<T> vì chúng ngụ ý khả năng sửa đổi bộ sưu tập.

Vì vậy, muốn trả lại T[] làm bộ sưu tập có kích thước cố định. Ngoài ra mảng có thể dễ dàng ánh xạ tới bất kỳ khung, nền tảng khác, v.v.

Và thích chấp nhận IEnumerable<T> để nhấn mạnh rằng một phương pháp sẽ liệt kê bộ sưu tập đó.

+3

T [] không phải là một bộ sưu tập chỉ đọc: bạn có thể sửa đổi các phần tử của một mảng. Ngược lại, IList không hàm ý khả năng sửa đổi tập hợp - ví dụ: IList .IsReadOnly là đúng cho ReadOnlyCollection . Nếu điều quan trọng là người gọi không sửa đổi bộ sưu tập được trả lại, có lẽ tốt nhất là trả về IList và thực hiện như một ReadOnlyCollection của các đối tượng không thay đổi. – Joe

+0

@Joe: Bạn nói đúng. Không chỉ đọc. Chỉ cần kích thước cố định. – abatishchev

12

Tôi có xu hướng chỉ trả lại IEnumerable<T> khi tôi muốn gợi ý cho người gọi rằng việc triển khai có thể sử dụng đánh giá lười biếng. Nếu không, tôi thường trả về IList<T> hoặc ICollection<T> và triển khai dưới dạng ReadOnlyCollection<T> nếu kết quả phải là chỉ đọc.

Đánh giá lười biếng có thể là một cân nhắc quan trọng: nếu việc triển khai của bạn có thể ném ngoại lệ, điều này sẽ không bị ném cho đến khi người gọi bắt đầu liệt kê kết quả. Bằng cách trả lại IList<T> hoặc ICollection<T>, bạn đảm bảo rằng mọi ngoại lệ sẽ được ném vào thời điểm phương thức được gọi.

Trong trường hợp của phương pháp WCF, trả về IEnumerable<T> từ phương pháp sử dụng đánh giá lười biếng có nghĩa là bất kỳ ngoại lệ nào cũng không được ném cho đến khi phản hồi của bạn được tuần tự hóa - cho bạn ít cơ hội hơn để xử lý phía máy chủ.

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