2010-05-28 14 views
5

desde C# Via CLR:¿Por qué el tipo de emisor nula cuando se trata de eventos

Nota Mucha gente se pregunta por qué el patrón evento requiere el parámetro emisor ser siempre el tipo de objeto Después de todo, ya que el MailManager se ser el único tipo provoca un evento, con objeto una EventArgs NewMail, hace sentido más por el método de devolución de llamada a ser un prototipo de esta manera:

void MethodName(MailManager sender, NewMailEventArgs e); 

El patrón requiere el parámetro emisor a ser de tipo de objeto sobre todo debido a la herencia ¿Qué pasa si Mai lManager se utiliza como clase base para SmtpMailManager? En este caso, el método de devolución de llamada debe tener el parámetro remitente como prototipo SmtpMailManager en lugar de correo Manager, pero esto no puede suceder porque SmtpMai lManager acaba de heredar el NewMai l evento Así que el código que se esperando SmtpMail Director para elevar el evento debe todavía tiene que emitir el argumento remitente a SmtpMailManager En otras palabras , el elenco sigue siendo requerido, por lo que el parámetro emisor bien podría ser escrito como objeto.

La siguiente razón para escribir el parámetro emisor como Obj ect es sólo fexibilidad Permite al delegado a ser utilizado por varios tipos que ofrecen un evento que pasa por objeto un NewMail EventArgs Por ejemplo, un PopMai lManager clase podría utilizar el delegado incluso si esta clase no se derivaron de mail Manager

yo simplemente no puedo entender por qué el remitente es un objeto - ¿Por qué puede no ser generified? así que la mayoría de las veces no es necesario hacer moldes genéricos

+2

Formatee su texto antes de publicarlo: los espacios adicionales en esta publicación y la anterior hacen que sea muy difícil de leer (ya que todo esto se publica como código) . –

Respuesta

7

genéricos no existía en la versión C# 1.

3

Incluso si los genéricos se llevaron a cabo alrededor de esto, todavía tendría el mismo problema. Dentro de su objeto MailManager, debe llamar al this.EventName<MailManager>(this, args), por lo que solo coincidirá con las personas que se suscribieron a ese evento escrito.

Concedido, podrían volver a trabajar toda la manera en que el CLR busca los métodos y eventos para que sean muy sueltos. Entonces tendríamos Javascript # en lugar de C#, sin embargo: p

Cuestiones relacionadas