2010-05-28 17 views
5

Từ C# Via CLR:Tại sao là loại người gửi null khi đối phó với các sự kiện

Note Rất nhiều người tự hỏi tại sao mô hình sự kiện đòi hỏi các thông số gửi luôn là kiểu Object Sau khi tất cả, kể từ khi MailManager sẽ là loại chỉ nuôi một sự kiện với phản đối một EventArgs NewMail, nó làm cho ý nghĩa hơn đối với phương pháp gọi lại để được prototyped như thế này:

void MethodName(MailManager sender, NewMailEventArgs e); 

Các mô hình đòi hỏi các thông số gửi là kiểu Object chủ yếu vì thừa kế gì nếu Mai lManager được sử dụng như một lớp cơ sở cho SmtpMailManager? Trong trường hợp này, phương pháp callback nên có tham số gửi prototyped như SmtpMailManager thay Mail Manager, nhưng điều này không thể xảy ra vì SmtpMai lManager chỉ thừa hưởng NewMai l kiện Vì vậy, các mã mà là mong SmtpMail quản lý để tăng sự kiện vẫn phải truyền đối số người gửi tới SmtpMailManager Trong các từ khác, dàn diễn viên vẫn là bắt buộc, vì vậy thông số người gửi cũng có thể được nhập là Đối tượng.

Lý do tiếp theo để gõ tham số gửi như obj vv chỉ là fexibility Nó cho phép các đại biểu để được sử dụng bởi nhiều loại cung cấp một sự kiện mà đi một NewMail EventArgs đối tượng Ví dụ, một PopMai lManager lớp có thể sử dụng đại biểu thậm chí nếu lớp này không có nguồn gốc từ mail Manager

tôi chỉ đơn giản là không thể hiểu tại sao người gửi là một đối tượng - Tại sao có thể nó không được generified? nên hầu hết thời gian chúng tôi không cần phải làm phôi chung

+2

Vui lòng định dạng văn bản của bạn trước khi đăng - không gian thêm trong bài đăng này và bài viết trước của bạn khiến chúng rất khó đọc (vì tất cả đều được đăng dưới dạng mã) . –

Trả lời

7

Generics không tồn tại trong phiên bản C# 1.

3

Thậm chí nếu Generics đã được triển khai xung quanh này, bạn vẫn sẽ có cùng một vấn đề. Bên trong đối tượng MailManager của bạn, bạn sẽ gọi số this.EventName<MailManager>(this, args) và vì vậy nó sẽ chỉ khớp với những người đã đăng ký sự kiện đã nhập đó.

Được cấp, họ có thể làm lại toàn bộ cách thức và các sự kiện được CLR tra cứu để nó rất lỏng lẻo. Sau đó, chúng tôi sẽ có Javascript # thay vì C#, mặc dù: p

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