2012-03-11 39 views
5

Áp phích tại Are EventArg classes needed now that we have genericsDoes .NET have a built-in EventArgs<T>? được khuyến khích chống lại một EventArgs chung, ít nhất đó là cảm giác tôi nhận được.Chung EventArgs cho các loại được xây dựng trong

Có hợp lý khi sử dụng nó khi tất cả những gì tôi cần là một trong các kiểu dựng sẵn? Trong trường hợp cụ thể của tôi, tôi đang đọc từ luồng trên TCP và khi nhận được dữ liệu, người đăng ký sẽ được thông báo.

public event EventHandler<EventArgs<string>> data_received = delegate { }; 

... 

while (!reader.EndOfStream) 
{ 
    if ((data = reader.ReadLine()) != "") 
    { 
     this.data_received(this, new EventArgs<string>(data)); 
    } 
} 

Hoặc có lẽ sự kiện không phải là cách tốt nhất để chuyển dữ liệu tới người đăng ký?

Trả lời

5

Câu trả lời ngắn: phụ thuộc.

Bạn có thể xem xét EventArgs<T> lớp như Tuple<T> để chuyển và lưu dữ liệu đến/từ phương pháp. Trong một số trường hợp đơn giản và để sử dụng nội bộ Tuple<T> là thích hợp nhưng đối với các trường hợp phức tạp hơn hoặc cho bề mặt công cộng thì sẽ thích hợp hơn khi sử dụng loại riêng biệt.

Với EventArgs<T> chúng tôi có nhiều hoặc ít hơn cùng một dung dịch pha loãng. Đối với việc sử dụng nội bộ của nó OK để sử dụng loại này, nhưng đối với API công cộng nó có thể dẫn đến cơn ác mộng duy trì.

Trong trường hợp cụ thể của bạn, có vẻ như OK khi sử dụng EventArgs<T> ở cái nhìn đầu tiên, nhưng nếu sau này bạn sẽ quyết định thêm một số thông tin bổ sung cho điều này ngay cả như EndPoint? Trong trường hợp này, bạn có thể sử dụng EventArgs<T, U> (như Tuple<T, U>) hoặc bạn có thể chuyển sang lớp học EventArgs tùy chỉnh. Trong cả hai trường hợp, bạn sẽ phá vỡ tất cả các khách hàng của bạn và nếu bạn chỉ có một khách hàng của mã này - ok của nó, nhưng nếu không ...

Tóm lại, cho nội dung của nó ok sử dụng EventArgs, nhưng đối với bề mặt công cộng tôi đề xuất sử dụng args sự kiện tùy chỉnh.

P.S. Quy ước đặt tên chung cho các sự kiện là CamelCase và trong trường hợp cụ thể của bạn, điều đó có nghĩa là DataReceived là tên phù hợp hơn cho sự kiện của bạn.

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