Clear non dispone i controlli, causando una perdita di memoria. Dal collegamento:
La chiamata del metodo Clear non rimuove le maniglie di controllo dalla memoria. È necessario chiamare esplicitamente il metodo Dispose per evitare perdite di memoria.
Poiché lo smaltimento all'interno di un ciclo scombina l'indicizzazione, è possibile copiare la raccolta di controllo ad un altro elenco ed eseguire un ciclo ForEach
su di loro o utilizzare un all'indietro For
ciclo.
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i)
myTableLayoutPanelControls[i].Dispose();
Calling Dispose
rimuoverà i controlli dalla memoria (quando il GC raccoglie). Ciò gestirà anche la chiamata del metodo Dispose
del controllo figlio.
Un problema è se si dispone di un controllo personalizzato che implementa IDisposable
o si sta sovrascrivendo il metodo Dispose
senza chiamare il metodo base
. Nel metodo Dispose
del tuo oggetto devi assicurarti di aver annullato l'iscrizione a eventi al di fuori del tuo ambito. Se non lo fai, quel riferimento manterrà vivo il tuo oggetto.
Se nessun altro oggetto è in possesso di un riferimento ad essi, i GC sono disposti. – Magnus
Giusto, ma mi chiedo, il pannello Sub-Tablelayout contiene un riferimento sui suoi figli e i bambini un riferimento sul suo genitore. Come posso essere sicuro che il GC li rimuove sempre correttamente – Xaser