2012-09-18 16 views

Trả lời

6

Vâng, đó là cú pháp chính xác. Tuy nhiên, chúng tôi khuyên bạn nên sử dụng trình xử lý hàm thay vì lambda vì lambda có thể giới thiệu tham chiếu vòng tròn và ngăn không cho bộ nhớ được giải phóng.

http://msdn.microsoft.com/en-us/library/windows/apps/xaml/hh755799.aspx

Nói chung, nó tốt hơn để sử dụng một hàm có tên, chứ không phải là một lambda, cho một event handler trừ khi bạn rất cẩn thận để tránh tham chiếu vòng tròn . Hàm được đặt tên sẽ ghi con trỏ "this" theo tham chiếu yếu , trong khi lambda nắm bắt nó bằng tham chiếu mạnh và tạo tham chiếu vòng tròn. Để biết thêm thông tin, xem phần Tài liệu tham khảo Weak và chu trình ngắt (C++/CX).

4

Đây là những gì tôi đã kết thúc.

animation->Completed += ref new EventHandler<Object^>([this](Object^, Object^) 
{ 
    animtion->Begin(); 
}); 
+0

Nếu tôi hiểu ThomasP ở trên sẽ không chụp được điều này bằng cách ref mạnh và do đó tạo tham chiếu vòng tròn tạo ra rò rỉ bộ nhớ tiềm ẩn. http://msdn.microsoft.com/en-US/library/windows/apps/hh699859.aspx dường như ngụ ý bạn nên nắm bắt điều này bằng cách sử dụng WeakReference? – FuleSnabel

+0

Thật không may là các sự kiện sử dụng tham chiếu mạnh mẽ. Khi nào tôi muốn một sự kiện để giữ một vật thể còn sống? Đó là một trong số ít những phàn nàn của tôi về C#. –

+0

Tôi cùng quan điểm và tôi nghi ngờ đó là lý do tại sao họ giới thiệu IWeakEventListener trong WPF. Đó là clunk mặc dù. (họ cũng nên thực hiện các giá trị null không an toàn IMHO) – FuleSnabel

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