2010-09-08 13 views

Respuesta

12

Cuando llame al Dispose en el formulario, llamará al Dispose para cada control en su colección Controls. Esos controles a su vez harán lo mismo, por lo que al final todos los controles 'Dispose método deberían haber sido invocados. Tenga en cuenta que esto no se basa en si los controles están presentes en el diseñador o no; se basa en las instancias de control que se encuentran en la colección Controls del formulario en el momento en que se realiza la llamada al Dispose.

El único caso en el que pude ver que esto no sucedería es si usted crea algún control de contenedor usted mismo y reemplaza Dispose sin propagar la llamada a la clase base ni itera sobre los controles contenidos y llama al Dispose.

+0

Sí. Los componentes se hacen de forma diferente, eso es de lo que se ocupa el método Dispose() generado automáticamente. Quitar un control de la colección Controls y no desecharlo es una buena manera de filtrar. –

4

Debería. Es posible que deba buscar en el archivo YourForm.designer.cs. Se parece a esto:

protected override void Dispose(bool disposing) 
{ 
    if(disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing) 
} 

La llamada base.Dispose(); se hará cargo de la limpieza de los controles agregados al Formulario.

+0

Eso no es del todo cierto; el campo 'components' es' null' a menos que tenga componentes que no sean UI (como 'Timer',' HelpProvider' o 'BackgroundWorker') en el formulario. 'components' maneja la eliminación de esos componentes. No * invoca deshacerse de otros controles como botones, cuadros de texto, etc. –

+0

Exactamente, los controles del formulario están realmente eliminados mediante la llamada a 'base.Dispose()', es decir, dentro de 'Control.Dispose()'. En realidad, se está limpiando mucho más, como verán al buscar 'Form.Dispose()' con Reflector. –

+0

Actualizaciones, gracias por los comentarios – SwDevMan81

Cuestiones relacionadas