2013-03-01 23 views
5

Lassen Sie uns sagen, dass ich einige Komponenten wie dieses:Wem gehören Kontrollen?

class SomeForm : Form 
{ 
    private Control example; 

    public void Stuff() 
    { 
     this.example = new ComboBox(); 
     // ... 
     this.Controls.Add(example); 
    } 

    public void OtherStuff() 
    { 
     this.Controls.Remove(example); 
    } 
} 

Wer für den Aufruf Dispose am Beispiel Kontrolle verantwortlich ist? Ist das Entfernen aus this.Controls Ursache für die Entsorgung? Oder gibt es Leckagen von Fenstergriffen, die die Steuerung unterstützen?

(als Referenz, frage ich das, weil ich die Windows Forms-Designer generiert Code nicht sehen, wo Entsorgen Sie die auf einem Formular Kinder zu nennen)

Antwort

5

Form.Dispose() wird die Steuerelemente innerhalb der Controls Sammlung entsorgen. Wenn Sie also die Steuerung von Controls entfernen, müssen Sie die Steuerung selbst entsorgen.

3

Wenn das Formular dieses Steuerelement enthält, angeordnet ist, alle Steuerelemente, die Sie werden in der Eigenschaft Steuerelemente gespeichert. Sie müssen das benutzerdefinierte Steuerelement nicht aus der Sammlung entfernen. Stellen Sie nur sicher, dass das enthaltene Formular entsorgt wird.

Wenn Sie das Steuerelement aus der Auflistung entfernen, wird dieses Steuerelement schließlich aus dem Gültigkeitsbereich fallen und für Garbage Collection unleserlich sein. Wenn GC ausgeführt wird, ruft es den Finalizer/Destruktor auf, der im Fall der Form-Klasse einfach die Dispose-Methode aufruft. Es ist schlecht, sich darauf zu verlassen. Sie sollten immer sicherstellen, dass Sie die Dispose-Methode für Klassen, die die IDisposable-Schnittstelle implementieren, deterministisch (manuell) aufgerufen haben, sobald Sie damit fertig sind.

+0

Sie behaupten also, dass die Kontrolle wird durchgesickert? – Servy

+0

Absolut nicht. Wie ich in meiner Antwort gesagt habe, werden alle Steuerelemente in der Eigenschaft Controls entfernt, wenn das enthaltende Formular entfernt wird. Sie müssen also nur sicherstellen, dass die enthaltene Formularinstanz entsorgt wird. –

+0

Das Steuerelement ** ist nicht ** in der Sammlung "Steuerelemente", weil er es aus dieser Sammlung entfernt hat, bevor das übergeordnete Element entfernt wurde. Es scheint, dass Sie den ganzen Punkt der Frage verpasst haben. – Servy

0

gehen immer auf die Quelle in Zweifel:

Form.Dispose ein bisschen wie folgt aussieht:

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     ... lots and lots of weird optimized checks ... 
     base.Dispose(disposing); 

Ok ... Form ist ein ContainerControl, so:

ContainerControl.Dispose:

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this.activeControl = null; 
    } 
    base.Dispose(disposing); 
    this.focusedControl = null; 
    this.unvalidatedControl = null; 
} 

Grrr * ... ok, ContainerControl ist ein Control:

Control.Dispose:

protected override void Dispose(bool disposing) 
{ 
    ... a whole lot of resource reclaiming/funky code ... 
    ControlCollection controls = (ControlCollection) 
      this.Properties.GetObject(PropControlsCollection); 
    if (controls != null) 
    { 
     for (int i = 0; i < controls.Count; i++) 
     { 
       Control control = controls[i]; 
       control.parent = null; 
       control.Dispose(); 
     } 
     this.Properties.SetObject(PropControlsCollection, null); 
     } 
     base.Dispose(disposing); 

Also ja; Rufen Sie Dispose auf einem Formular auf, um die darin enthaltenen Steuerelemente zu entfernen.

+0

Das ist aber nicht die Frage, die die Frage stellt; es fragt, ob nur Kontrollen in der "Controls" -Sammlung entsorgt werden, wenn das Formular entsorgt wird, was bedeutet, dass er, wenn er die Kontrolle entfernt (was er tut), jetzt dafür verantwortlich ist, oder gibt es einen anderen Mechanismus (wie z eine Kontrolle, wenn es aus der Sammlung entfernt wird), die ihn daran hindert, darüber zu verfügen. – Servy

+1

Erm, nicht jeder hat Zugriff auf .NET-Framework-Quellcode. –

+0

@Servy: Ich interessiere mich für beide –