Aktualizacja (podziękowania dla komentujących): przekazanie immunitabilności oznacza, że klonowanie nie ma wpływu na zlecenie.
Kiedy ktoś pisze:
myDelegate += AHandler
całkowicie nowa instancja delegata jest tworzona i przypisane do myDelegate.
Dlatego poniższy kod będzie działał dokładnie tak samo bez połączenia klonowania.
MulticastDelegate (typ podstawowy) ma metodę klonowania.
Aby uzyskać dostęp do podstawowego uczestnika, może być konieczne uniknięcie zwykłego helpera, które generuje słowo kluczowe zdarzenia, oraz bezpośrednie zarządzanie elementami (niestandardowe dodawanie i usuwanie akcesorów).
Aby to pokazać:
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();
}
}
Dzięki za wskazanie tego. To jest najlepsze dla wydarzeń w moim własnym kodzie. – weiqure
Dziękuję bardzo za to. Potrzebowałem dobrego rozwiązania problemu klonowania obiektów przez serializację binarną, nie korzystającego z subskrybowanych zdarzeń, albo musiałbym wdrożyć ICloneable w kilkuset klasach. – user1039513