2010-01-29 19 views
5

¿Por qué Visual Studio agrega este código a la clase parcial Class.Designer.cs? ¿Alguien puede decirme cuándo esta variable de componentes va a obtener algún valor? ¿Cuál es el patrón a seguir aquí?Disposición de controles en Winforms

private System.ComponentModel.IContainer components = null; 

     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 
     protected override void Dispose(bool disposing) 
     { 
      if(disposing && (components != null)) 
      { 
       components.Dispose(); 
      } 
      base.Dispose(disposing); 
     } 

Respuesta

4

El campo privado components se utiliza para realizar un seguimiento de los componentes desechables en su formulario.

this.components = new System.ComponentModel.Container(); 
this.timer1 = new System.Windows.Forms.Timer(this.components); 

El patrón que se muestra en el método Dispose(bool) que normalmente se conoce como thedisposablepattern: intenta arrastrar en un componente Timer, y debería ver algo como esto en el diseñador de código generado. Básicamente, el patrón garantiza que se eliminarán todos los componentes rastreados, incluso si nunca llama al método Dispose explícitamente, en cuyo caso la clase base de su formulario llamará al método Dispose en su finalizador (durante la recolección de elementos no utilizados).

1

components se asigna cuando agrega componentes no visuales, que también deben eliminarse de una manera determinante (para obtener más información, consulte el patrón IDisposable).

0

No todos los componentes lo utilizan, por ejemplo, un HelpProvider y EventLog. Incluso puedes comentarlo en estos casos. Suena como un bodge ms para mí.

+0

Heh, en una forma sin componentes desechables, Resharper sugiere que el campo 'readonly' :) –

4

Es un código que se produce mediante la plantilla del elemento Formulario (common7 \ ide \ itemtemplates \ csharp \ windows forms \ 1033 \ form.zip \ form.designer.cs). En realidad tiene un error, el método InitializeComponent() que contiene inicializa la variable "this.components" innecesariamente. Puede eliminar la declaración del código de forma segura si su formulario no tiene ningún componente. El diseñador lo regresará automáticamente si agrega un componente más adelante.

Otra cosa que no es tan agradable es que el método Dispose() se coloca en el archivo Designer.cs. Realmente pertenece en el archivo form.cs para que pueda agregar las llamadas a Dispose() para los campos en su formulario que deberían eliminarse. No dude en mover el código usted mismo, modificar el archivo del diseñador de esta manera no tiene ningún efecto secundario desagradable. Solo mantente alejado del código que está entre corchetes con la región del "código generado".

Como se menciona en la mayoría de las otras respuestas, este código es necesario para llamar al método Dispose() de cualquier componente que haya eliminado en el formulario cuando se cierra el formulario. Los controles en el formulario deben eliminarse también, pero eso es automático. La clase Form los encuentra de nuevo al iterar la colección Controls.

Cuestiones relacionadas