2012-04-02 36 views
8

Nó không hoàn toàn rõ ràng với tôi những gì đang xảy ra trong tình huống này.Ai đó có thể giải thích những gì đang diễn ra đằng sau hậu trường?

Tôi mong đợi cả hai chức năng sẽ được kích hoạt.

Lớp EventHander lưu trữ danh sách các hàm để kích hoạt thành mảng - và mảng được sao chép sang mảng mới mỗi lần thêm/xóa - hoặc khi gán, toàn bộ nội dung được sao chép vào một "bộ sưu tập" mới - và không chỉ là một tham chiếu.

Ai đó làm ơn soi sáng cho tôi: D

Dưới đây là một kịch bản LINQPad nhỏ:

public class Moop 
{ 
    public EventHandler myEvent; 
} 

void Main() 
{ 
    var moo = new Moop(); 
    moo.myEvent += (o, sender) => { "Added to Moop #1".Dump(); }; 

    var moo2 = new Moop(); 

    //Copy the reference, I assume? 
    moo2.myEvent = moo.myEvent; 

    moo2.myEvent += (o, sender) => { "Added to Moop #2".Dump(); }; 

    //Fire the event on #1 
    moo.myEvent(null, null); 
} 
+0

Kìa sức mạnh của quá tải của nhà điều hành và các tệ nạn mang lại. – CodingBarfield

Trả lời

8

danh sách xử lý tổ chức sự kiện là các đại biểu, và các đại biểu là không thay đổi - như chuỗi. Vì vậy, bạn sao chép các đại biểu, và xử lý sự kiện thứ hai được "thêm vào" đại biểu thứ 2, không phải là người đầu tiên.

Bạn có thể tìm hiểu thêm về đại biểu tại http://www.c-sharpcorner.com/uploadfile/Ashush/delegates-in-C-Sharp/

Chúc may mắn!

+0

Chính xác hơn, thể hiện ủy nhiệm 'Moop' thứ hai được thay thế bằng liên kết của giá trị ban đầu (" Đã thêm vào Moop # 1 "...) và trình xử lý sự kiện thứ hai (" Đã thêm vào Moop # 2 "...). Vì vậy, khi bạn làm '+ = ...' bạn đang thay thế giá trị ở phía bên tay trái. Nhưng ý chính của câu trả lời này là chính xác. –

+0

Thật vậy. Đó là lý do tại sao tôi đặt "thêm vào" giữa các dấu ngoặc kép. –

+2

Để làm cho nó rõ ràng hơn một chút (không mâu thuẫn với bất cứ điều gì bạn đã nói), 'delegate + = newDelegate;' có nghĩa là 'delegate = Delegate.Combine (delegate, newDelegate);', và từ đó rõ ràng hơn là một delegate mới được gán cho trường. – hvd

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