2008-09-19 24 views
6

Một điều tôi quan tâm là tôi đã khám phá ra hai cách đăng ký đại biểu cho các sự kiện.Có an toàn khi thêm đại biểu vào các sự kiện có từ khóa mới không?

  1. OnStuff + = this.Handle;
  2. OnStuff + = new StuffEventHandler (this.Handle);

Cái đầu tiên sạch sẽ và có ý nghĩa khi thực hiện "OnStuff - = this.Handle;" để hủy đăng ký khỏi sự kiện ... Nhưng với trường hợp sau, tôi nên làm "OnStuff - = new StuffEventHandler (this.Handle);"? Có vẻ như tôi không loại bỏ gì cả, vì tôi đang ném vào một tham chiếu khác của StuffEventHandler. Sự kiện có so sánh người được ủy quyền theo tham chiếu không? Tôi lo ngại rằng tôi có thể bắt đầu một bộ nhớ khó chịu ở đây. Đưa tôi đi? Tôi không có tham chiếu đến "StuffEventHandler mới" mà tôi đã đăng ký trước đó.

Nhược điểm của việc làm # 1 là gì?

Lợi ích của việc làm số 2 là gì?

+0

các cuộc thảo luận liên quan tại địa chỉ: http://stackoverflow.com/questions/1341895/c-event-removal-syntax và http://stackoverflow.com/questions/1178725/how-to-unset-event – JeffH

Trả lời

6

Bạn không cần phải lo lắng về việc giữ tham chiếu đến đại biểu đã đăng ký ban đầu và bạn sẽ không bắt đầu "hồ bơi bộ nhớ khó chịu".

Khi bạn gọi "OnStuff - = new StuffEventHandler (this.Handle);" mã loại bỏ không không so sánh đại biểu bạn đang xóa bằng tham chiếu: nó kiểm tra tính bình đẳng bằng cách so sánh các tham chiếu đến (các) phương thức đích mà đại biểu sẽ gọi và loại bỏ các đại biểu phù hợp từ "OnStuff".

Bằng cách này, "OnStuff" chính nó là một đối tượng đại biểu (từ khóa sự kiện mà tôi giả sử bạn có trong tuyên bố của bạn chỉ đơn giản là hạn chế khả năng truy cập của các đại biểu).

2

Tôi đã có ấn tượng rằng 2 chỉ là đường cú pháp. Chúng phải là chính xác .

10

Số một chỉ là viết tắt mà sẽ tạo ra cùng một MSIL như là một thứ hai, tại loại biên dịch nó sẽ xem xét điều này. Cầm và suy ra các đại biểu để nhanh chóng. Nhưng bạn không bao giờ nên hủy đăng ký bằng cách sử dụng mới.

Vì vậy, không có sự khác biệt giữa 2, chỉ cần một số cú pháp đường để làm cho mã của chúng tôi sạch hơn.

+0

1, cách đầu tiên được sử dụng để làm cách để thực hiện điều đó trong .Net v1 và 1.1, đường cú pháp được thêm vào trong v2. – Mendelt

+0

Trên thực tế, nếu bạn có thể lao động tại sao tôi không nên hủy đăng ký bởi mới ... Nó hoạt động giống như vậy. Xin vui lòng đính kèm tài liệu tham khảo cho một số bài viết nếu bạn nói tôi không nên hủy đăng ký với từ khóa mới – Statement

+0

Bạn là chính xác, Nó thực sự không tạo ra sự khác biệt, tôi nghĩ rằng nó sẽ có. – sontek

1

Nếu tôi nhớ chính xác, thay thế đầu tiên chỉ đơn thuần là cú pháp đường cho lần thứ hai.

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