2011-10-24 22 views
18

Trong MSDN Events Tutorial hooking đến sự kiện được thể hiện với ví dụ:như thế nào loại bỏ một event handler với - = công việc khi một sự kiện "mới" được quy định

// Add "ListChanged" to the Changed event on "List": 
List.Changed += new ChangedEventHandler(ListChanged); 
... 
// Detach the event and delete the list: 
List.Changed -= new ChangedEventHandler(ListChanged); 

Trong trường hợp như tôi đã giữ một tham chiếu đến đại biểu. Ví dụ:

ChangedEventHandler myChangedEvent = new ChangedEventHandler(ListChanged); 
List.Changed += myChangedEvent; 
... 
List.Changed -= myChangedEvent; 

Khi tôi xem mã ví dụ MSDN, "- = mới" có vẻ sai với tôi. Tại sao Danh sách này có tham chiếu đến trình xử lý sự kiện mà tôi vừa tạo?

Rõ ràng tôi phải suy nghĩ về mọi thứ theo cách sai? Tôi có thể nhận được một con trỏ đến một lời giải thích kỹ thuật về cách - = hoạt động, nhìn thấy như thế nào - = xuất hiện để không được sử dụng một.

+1

Related: http://stackoverflow.com/questions/7751247/c-sharp-why-shall-i-use-new-keyword-when-subscribing-for-an-event/7751271#7751271 – CodesInChaos

Trả lời

20

Vâng, đây là cú pháp confuzzling. Một đối tượng đại biểu phải được tạo trước khi trình xử lý có thể được gỡ bỏ khỏi sự kiện. Đó là lý do tại sao C# cũng hỗ trợ cú pháp này:

List.Changed -= ListChanged; 

trông hợp lý hơn. Trình biên dịch tuy nhiên vẫn tạo ra cùng một mã chính xác. Dưới mui xe, phương thức MulticastDelegate.RemoveImpl() lặp lại danh sách yêu cầu và loại bỏ các đối tượng ủy nhiệm khỏi danh sách có thuộc tính Target và Method khớp với nhau.

+0

Hans - là bạn nói rằng Delegate mới không thực sự được tạo khi sử dụng cú pháp '- = new'? (Tôi vẫn thích cú pháp '- = Handler', tôi nghĩ nó đọc tốt hơn nhiều, nhưng thật thú vị khi biết rằng mã được sinh ra là giống nhau. Hãy chỉ ra một khoảng trống có thể giữa những gì bạn đúng và trình biên dịch hiện đại có thể tạo ra !) – AAT

+0

Không, nó chắc chắn được tạo ra. Nó không được sử dụng cho bất cứ điều gì khác ngoài một so sánh, tìm kiếm một trận đấu với các đại biểu ban đầu bạn sử dụng khi bạn đăng ký sự kiện này. Mà giúp bạn tiết kiệm từ việc phải giữ cho rằng xung quanh. Tốt đẹp. Chỉ một chút rác là giá cả. –

+0

OK cảm ơn vì đã làm rõ. – AAT

10

Hủy đăng ký sự kiện sử dụng bình đẳng giá trị, chứ không phải bình đẳng tham chiếu. Vì vậy, các đại biểu mới được tạo ra phù hợp với một cũ (cả hai đối tượng mục tiêu và phương pháp đều giống nhau) và do đó loại bỏ các đại biểu cũ từ danh sách yêu cầu.

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