2012-04-02 13 views
8

No es totalmente obvio para mí lo que está sucediendo en esta situación.¿Alguien puede explicar lo que está sucediendo detrás de escena?

Espero que se activen ambas funciones.

O bien la clase EventHander está almacenando la lista de funciones para disparar como una matriz - y la matriz se copia a una nueva cada vez que se agrega/elimina algo - o cuando se realiza la asignación, todo se copia a una nueva "colección", y no solo una referencia.

Alguien por favor me ilumine: D

He aquí un pequeño script LINQPad:

public class Moop 
{ 
    public EventHandler myEvent; 
} 

void Main() 
{ 
    var moo = new Moop(); 
    moo.myEvent += (o, sender) => { "Added to Moop #1".Dump(); }; 

    var moo2 = new Moop(); 

    //Copy the reference, I assume? 
    moo2.myEvent = moo.myEvent; 

    moo2.myEvent += (o, sender) => { "Added to Moop #2".Dump(); }; 

    //Fire the event on #1 
    moo.myEvent(null, null); 
} 
+0

He aquí el poder de la sobrecarga del operador y los males que trae. – CodingBarfield

Respuesta

8

listas de controlador de eventos son delegados, y los delegados son inmutables - como cuerdas. Entonces copia el delegado y el segundo controlador de eventos se "agrega" al segundo delegado, no al primero.

Puede encontrar más información sobre los delegados en http://www.c-sharpcorner.com/uploadfile/Ashush/delegates-in-C-Sharp/

Buena suerte!

+0

Más precisamente, la segunda instancia de delegado de "Moop" se reemplaza por la unión del valor original ("Agregado a Moop # 1" ...) y el segundo controlador de eventos ("Agregado a Moop # 2" ...) Entonces cuando haces '+ = ...' estás reemplazando el valor en el lado izquierdo. Pero la esencia de esta respuesta es correcta. –

+0

De hecho. Es por eso que coloqué el "agregado a" entre comillas. –

+2

Para hacerlo un poco más claro (sin contradecir nada de lo que dijiste), 'delegate + = newDelegate;' más o menos significa 'delegate = Delegate.Combine (delegate, newDelegate);' y de eso está mucho más claro que un nuevo delegado está asignado al campo. – hvd

Cuestiones relacionadas