2011-02-08 4 views
5

Trong tất cả các cuốn sách .NET tôi đã đọc hướng dẫn để thực hiện các sự kiện giải thích rằng bạn cần phải phân lớp EventArgs và sử dụng EventHandler. Tôi tìm kiếm thêm thông tin trên http://msdn.microsoft.com/en-us/library/ms229011.aspx và nói "Không sử dụng System.EventHandler thay vì tạo các đại biểu mới theo cách thủ công để được sử dụng làm trình xử lý sự kiện". Tôi hiểu rằng có những lý do quan trọng để sử dụng EventArgs, nhưng câu hỏi của tôi không phải là "Tôi có nên làm theo cách này không?", Nhưng "Tôi có thể làm theo cách này không?".Có mối liên hệ đặc biệt nào giữa lớp EventArgs và từ khóa sự kiện không?

Có lý do nào khiến tôi không thể sử dụng đại biểu chung thay vì EventHandler với các sự kiện của tôi không? Ví dụ: nếu tôi muốn một người gửi được đánh máy mạnh (bất kỳ ai khác bị làm phiền bởi điều đó object sender?).

Để giải thích ý tôi là tốt hơn, có bất kỳ lý do nào sau đây sẽ không hoạt động?

public class IoC 
{ 
    public AbstractFactory GetAbstractFactory() 
    { 
     var factory = new AbstractFactory(); 
     factory.CreateObject +=()=>new object(); 
     return factory; 
    } 
} 
public class AbstractFactory 
{ 
    public event Func<object> CreateObject; 

    private object OnObjectCreated() 
    { 
     if(CreateObject == null) 
     { 
      throw new Exception("Not injected."); 
     } 
     return CreateObject(); 
    } 


    private object _injectedObject; 
    public object InjectedObject 
    { 
     get 
     { 
      if(_injectedObject == null) 
      { 
       _injectedObject = OnObjectCreated(); 
      } 
      return _injectedObject; 
     } 
    } 
} 
+0

Tôi đã thực hiện chính xác việc này để thực hiện điều tương tự với bộ sưu tập có thể quan sát. – asawyer

+0

Chủ đề liên quan: http://stackoverflow.com/questions/4828212/should-eventhandler-always-be-used-for-events/4828233 – CodesInChaos

Trả lời

5

Đó chỉ là quy ước và không yêu cầu ngôn ngữ. Bạn có thể sử dụng bất kỳ loại đại biểu nào làm sự kiện.

Tiêu chuẩn EventHandler<T> chữ ký có một vài lợi thế mặc dù:

  1. Bạn có thể mở rộng thông số EventArgs. Điều này sẽ không hoạt động nếu bạn có một tham số cho mỗi thứ bạn muốn chuyển vào trình tổ chức sự kiện.
  2. EventHandler chấp nhận lớp cơ sở EventArgs có thể đăng ký bất kỳ sự kiện nào theo quy ước
  3. Bạn có thể thêm Phương thức mở rộng vào EventHandler<T> xuất hiện trên tất cả các sự kiện.
  4. Loại trả về là void. Các kiểu trả lại khác không có ý nghĩa nhiều như tổ chức sự kiện.
  5. Bạn đang theo dõi quy ước. Theo quy ước thường là một ý tưởng tốt, trừ khi bạn có các đối số hấp dẫn không.
3

Tất cả tài liệu từ Microsoft là về thiết kế của thư viện lớp cơ sở và/hoặc nguyên tắc thiết kế khung chung. Bạn có thể sử dụng bất kỳ mẫu nào bạn muốn.

Điều đó nói rằng, nếu mọi người sẽ tiêu thụ mã của bạn, nó sẽ quen thuộc hơn với họ nếu bạn làm theo các mẫu mà Microsoft sử dụng.

0

Theo như tôi biết, EventHandler và EventArgs là thực tiễn tốt nhất, nhưng không có gì để ngăn cản bạn sử dụng bất kỳ đại biểu tùy ý nào trong tuyên bố sự kiện. Từ khóa sự kiện cung cấp cho bạn chức năng đặc biệt để có thể + = và - = đại biểu vào vùng sự kiện, trái ngược với việc chỉ có một trường hoặc thuộc tính của loại ủy nhiệm, sẽ chỉ chấp nhận một đại biểu duy nhất (trừ khi bạn soạn nhiều đại biểu bản thân bạn).

Lưu ý: Tôi không chắc chắn điều gì sẽ xảy ra với các đại biểu có giá trị trả lại trong vùng sự kiện. Đoán của tôi là các giá trị trả lại bị loại bỏ, vì nhiều đại biểu có giá trị trả về được gán cho sự kiện sẽ khó xử lý. Điều này sẽ yêu cầu một số thử nghiệm mặc dù.

+0

Giá trị cuối cùng được trả về. Nhưng đó chỉ là vô dụng. –