2010-05-28 17 views
7

Trong System.Interactive.dll (v1.0.2521.0) từ Tiện ích mở rộng phản ứng, EnumerableEx có cả phương thức Memoize và phương thức MemoizeAll. Tài liệu API giống hệt nhau cho cả hai tài liệu:System.Interactive: Sự khác biệt giữa Memoize() và MemoizeAll()?

Tạo một số đếm chỉ liệt kê số đếm gốc một lần và lưu trữ kết quả của nó.

Tuy nhiên, các phương pháp này rõ ràng không giống nhau. Nếu tôi sử dụng Memoize, số đếm của tôi có giá trị trong lần đầu tiên liệt kê nó và dường như bị trống lần thứ hai. Nếu tôi sử dụng MemoizeAll thì tôi sẽ nhận được hành vi tôi mong đợi từ mô tả của một trong hai phương pháp - tôi có thể liệt kê kết quả nhiều lần theo ý muốn và nhận được kết quả tương tự mỗi lần, nhưng nguồn chỉ được liệt kê một lần.

Bất cứ ai có thể cho tôi biết sự khác biệt dự định giữa các phương pháp này là gì? Trường hợp sử dụng cho Memoize là gì? Nó có vẻ như một phương pháp khá vô dụng với tài liệu thực sự khó hiểu.

Trả lời

7

để đặt nó thực sự đơn giản, MemoizeAll chỉ lưu trữ các mục mà bạn thực sự sử dụng - nhưng nó giữ cho tất cả các mục được lưu trong bộ nhớ cache mãi mãi. Memoize lưu trữ các mục ngay lập tức, nhưng chỉ lên đến kích thước bộ đệm được chỉ định. Điều này cho phép bạn có hiệu quả hơn nhiều với việc sử dụng bộ nhớ, v.v., nhưng bạn chỉ muốn sử dụng sau này nếu bạn hiểu cách tất cả người tiêu dùng của nguồn enumerable sẽ sử dụng nó.

Có một lời giải thích thực sự tuyệt vời của sự khác biệt trong bài viết trên blog này: http://bartdesmet.net/blogs/bart/archive/2010/01/07/more-linq-with-system-interactive-functional-fun-and-taming-side-effects.aspx

+0

Cảm ơn, đó thực sự là một lời giải thích tốt. Có lẽ các phiên bản tương lai của Reactive Extensions sẽ mở rộng mô tả của 'Memoize'. –

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