2012-06-07 38 views
9

Tôi muốn tạo từ điển của tất cả các Chế độ xem.Hiểu biết yếu về sự hiểu biết

public static Dictionary<string, WeakReference> vmCollection = new Dictionary<string, WeakReference>(); 

Thêm nó như thế này

vmCollection.Add(name, new WeakReference(viewModel)); 

Và cách gọi phương thức cần thiết như thế này ..

((vmCollection[viewModel].Target) as BaseViewModel).NewMessage(message); 

Tôi có cần duy trì nó như một WeakReference? Điều gì có thể là hậu quả nếu tôi không duy trì nó như là một WeakReference.

+3

đừng quên kiểm tra xem đối tượng có còn sống trước khi truy cập hay không - IsAlive on the WeakReference – Bond

+0

Nếu bạn đang tìm cách triển khai giải pháp loại tin nhắn thì bạn đã xem EventAggregator trong Prism chưa? – slugster

+0

Cảm ơn slugster.I muốn tự mình thực hiện nó để tránh bất kỳ loại phụ thuộc nào ... –

Trả lời

14

Hậu quả duy nhất của việc không sử dụng WeakReference là tham chiếu trong từ điển của bạn sẽ ngăn không cho các trường hợp Chế độ xem bị thu thập rác. Một WeakReference cho phép thu gom rác thải (giả sử không có tài liệu tham khảo khác ở đâu khác).

Một mục sẽ đủ điều kiện để thu thập rác khi không có tham chiếu đến nó. WeakReference không tạo ra tham chiếu "đếm được", do đó bạn có thể giữ nguyên tham chiếu đến nó, nhưng vẫn để cho nó đủ điều kiện nếu WeakReference của bạn là điều duy nhất còn lại nhìn vào nó.

Cho dù bạn cần hay không thực sự phụ thuộc vào loại vòng đời mà Mô hình xem của bạn có. Nếu họ cần xử lý hoặc nếu không "buông bỏ", thì bạn có thể cần phải sử dụng WeakReference hoặc vạch trần cách xóa tham chiếu khỏi từ điển thay thế.

Như tôi đã đề cập trong nhận xét. Tôi có xu hướng không sử dụng WeakReference như trái ngược với việc xử lý vòng đời của các đối tượng liên quan một cách rõ ràng. Điều đó nói rằng, chúng rất hữu ích khi bạn chỉ đơn giản là không có khả năng hiển thị của vòng đời tại các điểm có liên quan. Tôi nghĩ rằng trong trường hợp của bạn, bạn cần phải có khả năng hiển thị cần thiết, vì tất cả những điều này có thể xảy ra trong lớp giao diện người dùng và do đó, hãy thử sử dụng không sử dụng chúng.

Dưới đây là một số tài nguyên về chủ đề này:

Hướng dẫn trích xuất từ ​​trên MSDN link:

Sử dụng tài liệu tham khảo dài yếu chỉ khi cần thiết là trạng thái của đối tượng là u không thể đoán trước sau khi hoàn thành.

Tránh sử dụng các tham chiếu yếu cho các đối tượng nhỏ vì con trỏ chính nó có thể lớn hoặc lớn hơn.

Tránh sử dụng các tham chiếu yếu làm giải pháp tự động cho bộ nhớ sự cố quản lý. Thay vào đó, hãy phát triển chính sách lưu bộ nhớ đệm hiệu quả cho việc xử lý các đối tượng của ứng dụng của bạn là .

Tôi tin rằng điểm hướng dẫn cuối cùng áp dụng cho trường hợp của bạn.

+0

Cảm ơn rất nhiều Adam. nó sẽ là bất kỳ loại OverHead nếu ở bên an toàn hơn tôi sử dụng nó? –

+2

@RaoBHavik Chi phí sẽ là chi phí của cá thể đối tượng 'WeakReference' và cần phải liên tục kiểm tra xem đối tượng được tham chiếu vẫn có thể sử dụng được (rõ ràng là nó có thể được thu thập kể từ lần cuối bạn sử dụng nó). Tôi sẽ luôn tránh xa việc sử dụng chúng như trái ngược với việc xử lý vòng đời của các đối tượng một cách rõ ràng, nhưng đôi khi bạn chỉ không có khả năng hiển thị vòng đời để chúng có thể hữu ích. Tôi nghĩ rằng trong trường hợp của bạn, bạn nên có khả năng hiển thị nên có khả năng cố gắng không sử dụng chúng. –

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