2012-08-10 29 views
7

Trong lớp bắt nguồn từ một phần đôi khi tôi thấy sự kiện tuyên bố như:Ưu điểm của việc thêm các cá thể ủy nhiệm vào Component.Events (EventHandlerList) là gì?

private static readonly object LoadEvent = new object(); 
public event EventHandler<MyEventArgs> Load 
{ 
    add { Events.AddHandler(LoadEvent, value); } 
    remove { Events.RemoveHandler(LoadEvent, value); } 
} 

protected virtual void OnLoad(MyEventArg e) 
{ 
    var evnt = (EventHandler<MyEventArg>)Events[LoadEvent]; 
    if (evnt != null) 
     evnt(this, e); 
} 

Thay vì chỉ:

public event EventHandler<MyEventArgs> Load; 

protected virtual void OnLoad(MyEvent e) 
{ 
    if (Load != null) 
     Load(this, e); 
} 

Tôi bị cám dỗ để Refactor để sử dụng phương pháp ngắn hơn, nhưng tôi lưỡng lự trong trường hợp có một số ưu điểm khi sử dụng Component EventHanderList mà tôi đang thiếu.

Những lợi thế duy nhất mà tôi hiện có thể nghĩ đến là:

  • Khi các thành phần được xử lý, tất cả các mục trong EventHandlerList được loại bỏ, hiệu quả tự động unhooking xử lý sự kiện.
  • Có thể ít phân mảnh bộ nhớ hơn vì tất cả các đại biểu đính kèm sẽ tham gia vào EventHandlerList đơn lẻ.

Còn gì khác không?

(Đây là không một câu hỏi về việc sử dụng chung của add rõ ràng + loại bỏ các sự kiện.)

Trả lời

8

này là tốt cho thưa thớt sự kiện. Điều khiển giao diện người dùng có xu hướng có hàng chục sự kiện (đôi khi trở lên 100). Nếu một sự kiện giống như trường được sử dụng cho mỗi trường hợp, thì mỗi sự kiện yêu cầu trường sao lưu tham chiếu. Với 100 sự kiện, đó là 400 byte trên x86 hoặc 800 byte trên x64, ngay cả khi không một sự kiện nào được đăng ký.

Ví dụ: biểu tượng thắng System.Windows.Forms.Form có 91 sự kiện trước khi bạn thêm bất kỳ nào. Mỗi cá thể Control đơn lẻ có ít nhất 69.

Vì vậy; một hình thức cửa sổ với một vài nhãn, hộp đầu vào và các nút có thể dễ dàng có thêm 2000 trường tham chiếu (16k trên x86) hầu hết trong số đó không làm gì cả.

EventHandlerList về cơ bản là tra cứu khóa/giá trị, có nghĩa là nếu chỉ có 3 sự kiện được đăng ký (tôi đang nghĩ "Nhấp" và có thể một vài người khác) thì chỉ cần một lượng bộ nhớ danh nghĩa.

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