Czy programy obsługi zdarzeń zapobiegają usuwaniu śmieci?

Jeśli mam następujący kod:

MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;

Czy pClass będzie zbierany? Czy będzie się kręcił w pobliżu i odpalał swoje Wydarzenia, kiedy tylko się pojawią? Czy muszę wykonać następujące czynności, aby umożliwić wywóz śmieci?

MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;
Author: Cœur, 2008-11-18

4 answers

Dla konkretnego pytania "czy pClass będzie garbage collected": subskrypcja wydarzenia nie ma wpływu na zbieranie pClass (jako wydawcy).

Dla GC w ogóle( w szczególności, cel): to zależy czy moja funkcja jest statyczna czy instancyjna.

Delegat (taki jak subskrypcja zdarzeń) do metody instancji zawiera odniesienie do instancji. Tak więc tak, subskrypcja wydarzenia uniemożliwi GC. Jednak, gdy tylko obiekt opublikuje Zdarzenie (pClass powyżej) kwalifikuje się do odbioru, to przestaje być problemem.

Zauważ, że jest to jednokierunkowe; tzn. jeśli mamy:

publisher.SomeEvent += target.SomeHandler;

Wtedy "publisher" utrzyma "target" przy życiu, ale " target "nie utrzyma" publisher " przy życiu.

Więc nie: jeśli pClass i tak zostanie zebrany, nie ma potrzeby wypisywania słuchaczy. Jednak, jeśli pClass był długotrwały (dłuższy niż instancja z Mojafunkcją), to pClass mógł utrzymać tę instancję przy życiu, więc byłoby konieczne, aby Anuluj subskrypcję, jeśli chcesz, aby cel został zebrany.

Zdarzenia statyczne, jednak z tego powodu, są bardzo niebezpieczne, gdy są używane z aplikacjami obsługującymi instancje.

 182
Author: Marc Gravell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-18 10:56:09

Tak, pClass będą zbierane śmieci. Subskrypcja zdarzeń nie oznacza, że istnieje jakiekolwiek odniesienie do pClass.

An więc nie, nie będziesz musiał odłączać obsługi, aby pClass był zbierany.

 6
Author: Tor Haugen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-18 10:06:30

W momencie, gdy kawałek pamięci nie jest już odwołany, staje się kandydatem do zbierania śmieci. Gdy instancja twojej klasy wykracza poza zakres, nie jest już odwoływana przez twój program. Nie jest już używany i dlatego można go bezpiecznie zbierać.

Jeśli nie jesteś pewien, czy coś zostanie zebrane, zadaj sobie następujące pytanie: czy istnieje jeszcze odniesienie do tego? Procedury obsługi zdarzeń są odwoływane przez instancję obiektu, a nie odwrotnie.

 6
Author: lvaneenoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-18 10:55:37

pClass będą zbierane śmieci. Jeśli jednak powyższy fragment kodu znajduje się wewnątrz innej klasy, instancja tej klasy może nie zostać wyczyszczona, jeśli nie ustawisz pClass na null.

 0
Author: Arav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-19 21:25:36