2012-01-17 15 views
26

tôi đã xác định thành viên mới trong lớp của tôiKhông gán null loại bỏ tất cả các trình xử lý sự kiện từ một đối tượng?

protected COMObject.Call call_ = null; 

Lớp này có xử lý sự kiện sau đây mà tôi đăng ký

call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent); 

sẽ lập viên của tôi để null như sau để gỡ bỏ các xử lý sự kiện?

call_ = null; 

hoặc tôi phải hủy đăng ký - =?

Trả lời

28

có, bạn nên sử dụng quá tải -= để hủy đăng ký sự kiện.

chỉ cần gán tham chiếu đến null sẽ không tự động làm điều đó. Đối tượng vẫn sẽ lắng nghe sự kiện đó.

+0

Cảm ơn! Bạn có thể cho tôi một số liên kết của microsoft hay cách khác để xác minh nó? –

+0

Kiểm tra điều này: http://msdn.microsoft.com/en-us/library/ms366768(v=vs.90).aspx – Azodious

+1

@Dor Bạn không cần nó - +3 (và có thể nhiều hơn vào thời điểm tôi được thực hiện) là đủ để bạn biết rằng nó là đúng. Tuy nhiên - cuộc thảo luận về các sự kiện từ ngày VS2003 này sẽ làm rõ ... http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx –

1

Bạn phải sử dụng toán tử gán phép trừ (- =) để unsubscribe từ sự kiện. Chỉ sau khi tất cả các người đăng ký đã hủy đăng ký khỏi một sự kiện, cá thể sự kiện trong lớp nhà xuất bản được đặt thành rỗng.

7

Bạn nên luôn luôn bỏ đăng ký xử lý sự kiện của bạn bằng cách - = trước khi thiết lập để null hoặc xử lý đối tượng của bạn (chỉ cần thiết lập biến thành vô giá trị sẽ không ngừng đăng ký tất cả các bộ xử lý), như được đưa ra trong đoạn trích MSDN dưới đây:

Để ngăn trình xử lý sự kiện của bạn không được gọi khi sự kiện được nâng lên, chỉ cần hủy đăng ký khỏi sự kiện. Để ngăn chặn rò rỉ tài nguyên, điều quan trọng là phải hủy đăng ký khỏi các sự kiện trước khi bạn vứt bỏ một đối tượng thuê bao. Cho đến khi bạn hủy đăng ký từ một sự kiện, đại biểu multicast làm nền tảng cho sự kiện trong đối tượng xuất bản có tham chiếu đến đại biểu đóng gói trình xử lý sự kiện của người đăng ký. Miễn là đối tượng xuất bản giữ tham chiếu đó, đối tượng người đăng ký của bạn sẽ không bị thu gom rác.

giải thích tại liên kết dưới đây trong Unsubscribing phần:

How to: Subscribe to and Unsubscribe from Events (C# Programming Guide)

Xem thêm thông tin tại địa chỉ:

Why you should always unscubscribe event handlers

-1

Hủy bỏ tất cả các sự kiện, giả sử sự kiện này là một "hành động" loại:

Delegate[] dary = TermCheckScore.GetInvocationList(); 

if (dary != null) 
{ 
    foreach (Delegate del in dary) 
    { 
     TermCheckScore -= (Action) del; 
    } 
} 
+2

Đây là câu trả lời rất xấu; nếu bạn có quyền truy cập vào 'TermCheckScore' như một trường giống như sự kiện, thì bạn phải là ** bên trong ** kiểu khai báo; trong trường hợp này: ** chỉ cần đặt thành null **. 'TermCheckScore = null;' sẽ làm mọi thứ, nhưng hiệu quả hơn nhiều. –

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