2008-09-19 5 views
6

Una cosa que me preocupa es que descubrí dos formas de registrar delegados a eventos.¿Es seguro agregar delegados a eventos con la palabra clave new?

  1. OnStuff + = this.Handle;
  2. OnStuff + = new StuffEventHandler (this.Handle);

El primero es limpio, y tiene sentido hacer "OnStuff - = this.Handle;" para cancelar el registro del evento ... Pero en este último caso, ¿debería hacer "OnStuff - = new StuffEventHandler (this.Handle);"? Parece que no estoy eliminando nada, ya que incluyo otra referencia de StuffEventHandler. ¿El evento compara al delegado por referencia? Me preocupa que pueda comenzar un grupo de memoria desagradable aquí. ¿Consígueme? No tengo la referencia al "nuevo StuffEventHandler" que previamente registré.

¿Cuál es la desventaja de hacer # 1?

¿Cuál es el beneficio de hacer # 2?

+0

discusiones relacionada en: http://stackoverflow.com/questions/1341895/c-event-removal-syntax y http://stackoverflow.com/questions/1178725/how-to-unset-event – JeffH

Respuesta

6

No tiene que preocuparse por mantener una referencia al delegado registrado originalmente, y no va a iniciar un "desagradable grupo de memoria".

Cuando llama "OnStuff - = new StuffEventHandler (this.Handle);" el código de eliminación no no compara el delegado que está eliminando por referencia: comprueba la igualdad al comparar las referencias al (los) método (s) objetivo (s) que el delegado llamará, y elimina los delegados coincidentes de "OnStuff".

Por cierto, "OnStuff" en sí mismo es un objeto delegado (la palabra clave de evento que supongo que tiene en su declaración simplemente restringe la accesibilidad del delegado).

2

Tenía la impresión de que 2 es simplemente azúcar sintáctica. Deberían ser exactamente lo mismo.

10

El número uno es simplemente una abreviatura que generará el mismo MSIL que el segundo, en el tipo de compilación verá esto. Manipule e infiera el delegado para crear instancias. Pero nunca deberías anular tu suscripción usando new.

Así que no hay diferencia entre los 2, solo un poco de azúcar sintáctico para hacer nuestro código más limpio.

+0

De acuerdo +1, la primera manera solía ser la forma de hacer las cosas en .Net v1 y 1.1, el azúcar sintáctico se añadió en v2. – Mendelt

+0

En realidad, si pudiera trabajar por qué no debería cancelar el registro por nuevo ... Funciona de la misma manera. Adjunte referencias a algún artículo si dice que no debería cancelar el registro con la nueva palabra clave – Statement

+0

Tiene razón, en realidad no hace la diferencia, pensé que sí. – sontek

1

Si no recuerdo mal, la primera alternativa es meramente azúcar sintáctica para la segunda.

Cuestiones relacionadas