2010-01-29 21 views
5

Warum fügt Visual Studio diesen Code der partitionierten Klasse Class.Designer.cs hinzu. Kann mir jemand sagen, wenn diese Komponenten-Variable einen Wert bekommen wird? Wie sieht das Muster hier aus?Deaktivieren von Steuerelementen in 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); 
     } 

Antwort

4

Das private Feld components wird verwendet, um Wegwerfkomponenten auf Ihrem Formular zu verfolgen. Versuchen Sie, in einer Timer Komponente ziehen, und Sie sollten in den Designer generierten Code in etwa wie folgt:

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

Das Muster in der Dispose(bool) Methode angezeigt wird, in der Regel bezeichnet als thedisposablepattern. Grundsätzlich stellt das Muster sicher, dass alle überwachten Komponenten entsorgt werden, selbst wenn Sie die Methode Dispose nicht explizit aufrufen. In diesem Fall ruft die Basisklasse Ihres Formulars die Methode Dispose in ihrem Finalizer auf (während der Garbage Collection).

1

components wird zugewiesen, wenn Sie nicht visuelle Komponenten hinzufügen, die ebenfalls deterministisch angeordnet werden müssen (weitere Informationen finden Sie im IDisposable-Muster).

0

Nicht alle Komponenten verwenden es jedoch - zB ein HelpProvider und EventLog. Sie können es sogar in diesen Fällen auskommentieren. Klingt nach einem ms-bodge für mich.

+0

Heh, in einer Form ohne irgendwelche Einwegkomponenten schlägt Resharper vor, das Feld "readonly" zu machen :) –

4

Es ist Code, der von der Formularelementvorlage (common7 \ ide \ itemtemplates \ csharp \ windows forms \ 1033 \ form.zip \ form.designer.cs) erzeugt wird. Es hat tatsächlich einen Fehler, die InitializeComponent() -Methode initialisiert die Variable "this.components" unnötigerweise. Sie können die Anweisung sicher aus dem Code löschen, wenn Ihr Formular keine Komponenten enthält. Der Designer wird es automatisch zurückstellen, wenn Sie später eine Komponente hinzufügen.

Eine andere Sache, die nicht so nett ist, ist, dass die Dispose() - Methode in der Designer.cs-Datei abgelegt wird. Es gehört wirklich in die Datei form.cs, so dass Sie Dispose() -Aufrufe für Felder in Ihrem Formular hinzufügen können, die entsorgt werden sollen. Zögern Sie nicht, den Code selbst zu verschieben. Das Ändern der Designer-Datei hat auf diese Weise keine unangenehmen Nebenwirkungen. Halten Sie sich einfach von dem Code fern, der in die Region des "generierten Codes" eingeklammert ist.

Wie in den meisten anderen Antworten erwähnt, ist dieser Code erforderlich, um die Dispose() - Methode aller Komponenten aufzurufen, die Sie beim Schließen des Formulars auf dem Formular abgelegt haben. Steuerelemente auf dem Formular müssen ebenfalls entsorgt werden, aber das ist automatisch. Die Form-Klasse findet sie zurück, indem sie die Controls-Auflistung wiederholt.

Verwandte Themen