2009-08-27 15 views
10

Od Projektanta w VS powiedzmy, że klikniesz dwukrotnie na przycisk i wygeneruje ten moduł obsługi zdarzeń Click.Czy muszę anulować subskrypcję wszystkich programów do obsługi zdarzeń?

kod subskrypcji znajduje się w pliku designer.cs.

Zastanawiam się, czy w formularzu NIE MOGĘ się wypisać?

Ponadto, wszystkie formanty, które są w formularzu, zostaną usunięte po wydrukowaniu formularzy? to właściwie wywołuje rekursywnie każdą kontrolę?

Odpowiedz

15

Nie musisz odłączać wydarzenia w Dispose, jeśli podłączasz własne wydarzenie.

Trzeba się tylko o to martwić, jeśli zahaczymy zdarzenie w innym obiekcie. Powodem tego jest to, że haki zdarzeń utrzymują referencję żywą dla subskrybenta. Jeśli nie uda ci się odpiąć, nie będziesz zbierać śmieci, dopóki obserwowalny będzie nadal żywy.

Po podłączeniu własnego wydarzenia, masz odniesienie do siebie, które jest okrągłe, dlatego nie musisz się tym martwić.

Przyszedłem, aby wspierać bardziej luźno powiązane ze sobą wzory zdarzeń z tego powodu. To jest # 1 miejsce dla wycieków pamięci w .Net. Preferuję wzór Event Aggregator (z weak events).

+0

Dzięki za wspaniałe wyjaśnienie. Ma doskonały sens, aby nie odczepiać się, gdy jesteś przywiązany do siebie. – pdiddy

1

Dopóki kod obsługi zdarzenia jest sama forma, wtedy nie musiałby zrezygnować wydarzenia - jak nie byłby zwisające obsługi zdarzeń do kontroli jak sama forma byłaby zniszczona

2

Na pytanie "czy wywoła ono rekursywnie każdą kontrolę?", Odpowiedź brzmi "tak".

Prosty test można wykonać, umieszczając punkt przerwania w metodzie Dispose elementu sterującego.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.Controls.Add(new SuperButton()); 
    } 
} 

public class SuperButton : Button 
{ 
    protected override void Dispose(bool disposing) 
    { 
     //Place breakpoint on the line below 
     base.Dispose(disposing); 
    } 
} 
Powiązane problemy