2009-09-28 20 views
26

Robiłem to przez jakiś czas, ale nie zauważyłem, że używam new za każdym razem, gdy usuwam program obsługi zdarzeń. Czy mam tworzyć nowy obiekt?C# usuwanie programu obsługi zdarzeń

Zasadniczo istnieje różnica między 1 a 2?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT: Dobrze jest duplikatem. Przepraszam za to. Odpowiedź wysłana here.

Dwóch delegatów tego samego typu o tych samych celach, metodach i listach wywołań jest uznawanych za równe.

Odpowiedz

29

Nie ma różnicy między 1 a 2, ponieważ 2 to cukier syntaktyczny dla 1. Tylko jeśli 2 odnosiło się do pola instancji delegata na poziomie klasy, a nie do rzeczywistej nazwy metody, gdyby istniała różnica w skompilowanej IL.

Pod względem tego, co dzieje się w środowisku wykonawczym, metoda zdarzenia Remove wydaje się nie przejmować, czy przekazana do niej instancja delegata jest tą samą, co metoda przekazana do metody Add. Nie pamiętam, dlaczego tak jest, ale przypuszczam, że delegowane instancje są zawsze internowane.

EDIT: Jon Skeet mówi, że metoda wykorzystuje zdarzenie Remove równość wartości (Delegate.Equals) w celu określenia, które przenoszą na usunąć z listy, zamiast interning + równości odniesienia. Ten sam efekt końcowy, inna metoda. :-)

+0

Ponieważ delegat jest tylko odwołaniem do metody i (opcjonalnie) instancji, porównywanie tych dwóch elementów powinno wystarczyć do określenia równości. – Botz3000

+0

Tak, ale ogólnie rzecz ujmując, jeśli dwa razy wywołasz 'nowe T()' na arbitralnym typie odniesienia, otrzymasz dwie różne instancje. Ponieważ wydaje się, że nie ma to miejsca w przypadku delegatów, dedukuję, że konstruktor delegatów automatycznie interweniuje w instancjach, tak jak robi to klasa "Type". –

+0

internowany - co to znaczy? Dziękuję za odpowiedź. Ten rodzaj odnosi się do wątpliwości, które miałem. Zastanawiam się nad tym nowym, ponieważ tworzę nową instancję, kiedy dodam procedurę obsługi i tworzę nową, kiedy ją usuwam. Bardzo dziwne. – Sharun

13

Druga wersja jest odpowiednikiem pierwszej; po prostu używa krótszej składni. Zostało to zaimplementowane w języku C# 2.0

Powiązane problemy