Actualización (gracias a los comentaristas): la inmunidad del delegado significa que la clonación no logra nada en una asignación.
Cuando uno escribe:
myDelegate += AHandler
una nueva instancia de delegado se crea y se asigna a myDelegate.
Por lo tanto, el siguiente código funcionaría exactamente igual sin la llamada Clone.
MulticastDelegate (el tipo subyacente) tiene un método Clone.
Para poder llegar al delegado subyacente es posible que deba evitar el helper habitual que genera la palabra clave del evento, y administrar cosas directamente (agregar y eliminar accesadores personalizados).
Para mostrar esto:
class Program {
public delegate void MyDelegate(string name);
public event MyDelegate EventOne;
public void HandlerOne(string name) {
Console.WriteLine("This is handler one: {0}", name);
}
public void HandlerTwo(string name) {
Console.WriteLine("This is handler two: {0}", name);
}
public void HandlerThree(string name) {
Console.WriteLine("This is handler three: {0}", name);
}
public void Run() {
EventOne += HandlerOne;
EventOne += HandlerTwo;
Console.WriteLine("Before clone");
EventOne("EventOne");
MyDelegate eventTwo = (MyDelegate)EventOne.Clone();
MyDelegate eventTwo = EventOne;
Console.WriteLine("After
clone
copy");
EventOne("EventOne");
eventTwo("eventTwo");
Console.WriteLine("Change event one to show it is different");
EventOne += HandlerThree;
EventOne("EventOne");
eventTwo("eventTwo");
}
static void Main(string[] args) {
(new Program()).Run();
}
}
Gracias por señalar eso. Eso es lo mejor para los eventos en mi propio código. – weiqure
Muchas gracias por esto. Necesitaba una buena solución para la clonación de objetos a través de la serialización binaria que no disfrutaba de los eventos suscritos, o de lo contrario habría tenido que implementar ICloneable en varios cientos de clases. – user1039513