2009-12-28 6 views
8

Istnieje wiele wątków (a, b, c itd.) O tym, że Wyczyść() pozycje ING w pojemnikach NET robi nie utylizować je (poprzez wywołanie Dispose (prawda).Przejrzyste kontrole nie likwidują ich - jakie jest ryzyko?

najczęściej, IMHO, składniki Clear-ed nie są już używane w aplikacji, więc musi wyraźnie być usuwane po usunięciu ich z pojemników macierzystych.

Może to dobry pomysł, że Clear metoda zbierania miał bool parametr dispose, że jeśli w true również usuwa elementy kolekcji przed usunięciem z listy?

+0

Jeśli jest to wezwanie do utylizować w finalizatora, otrzyma zbyte. Jeśli nie ma, to prawdopodobnie (jeśli programista zastosuje zaakceptowane praktyki) nic nie będzie zarządzane i bezpiecznie będzie po prostu je zebrać. –

+0

@Aviad: Problem, że metoda Dispose nigdy nie zostanie wywołana przez GC, więc musisz to zrobić samodzielnie, przed wywołaniem Wyczyść przy odbiorze. – serhio

+0

Mam na myśli to, że jeśli programista kontroli nie umieścił wywołania w swoim finalizatorze (który jest wywoływany, gdy obiekt jest zbiorem śmieci) - to prawdopodobnie nie ma nic do pozbycia się. –

Odpowiedz

15

Pytanie o modyfikacje takie jak ta jest bez sensu, zespół Windows Forms został rozwiązany dość dawno temu. Jest w trybie konserwacji, brane są pod uwagę tylko kwestie bezpieczeństwa i niezgodności OS.

Inaczej jest na tyle prosty, aby stworzyć swój własny sposób, aby to zrobić:

public static class ExtensionMethods { 
    public static void Clear(this Control.ControlCollection controls, bool dispose) { 
     for (int ix = controls.Count - 1; ix >= 0; --ix) { 
     if (dispose) controls[ix].Dispose(); 
     else controls.RemoveAt(ix); 
     } 
    } 
    } 

Teraz można napisać:

panel1.Controls.Clear(true); 
+1

IIRC, kiedy "Wyrzuć" "Kontrolę", automatycznie usuwa kontrolę z odpowiedniego "ControlCollection", więc tak naprawdę nie potrzebujesz 'RemoveAt' (i może się to skończyć z' IndexOutOfRangeException'). – Aaronaught

+0

tak ... przynajmniej dla .NET 2 to nie zadziała. Ale pytanie jest trochę inne. Czy istnieje "ryzyko" nazywanie "Wyczyść" bez usuwania? – serhio

+2

Oczywiście, wyciek kontroli. Czy nie było to oczywiste z innych wątków? –

0

Odpowiadając na „Czym jest ryzyko” pytanie, ryzyko (lub ryzyko) kończy się brak uchwytów okiennych, chociaż może to trochę potrwać.

Mam "projektanta okien", który generuje okno ze skryptu. Za każdym razem, gdy zmieniam skrypt, okno jest odbudowywane (kontrolki wyczyszczone i odczytywane). W szczególnie złożonym oknie i za każdym razem, po wielu dziesiątkach odświeżeń, za każdym razem, po wielu dziesiątkach odświeżeń, w końcu otrzymam wyjątek "nie więcej uchwytów okiennych" i nie będę w stanie tworzyć żadnych dodatkowych elementów sterujących.

dość łatwo zastąpić rozmowę Controls.Clear() z czymś takim:

Controls.Cast<Control>().ForEach(c => c.Dispose()); 
Powiązane problemy