2009-08-19 3 views
2

Meine designer.cs Datei hat dieses Stub:Wie OnDispose Kontrolle geraten genannt - C#

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

ich eine C# Anwendung, die eine Form hat, die ich auf meinem Benutzersteuerung aufzurufen. Muss ich beim Schließen des Formulars explizit die Methode usercontrol.Dipose aufrufen?

Antwort

0

Wenn das Objekt nicht in einem Verwendungsblock ist, dann müssen Sie die dispose-Methode aufrufen.

Das gesagt, Sie könnten die dispose-Methode in den Finalizer des Steuerobjekts integrieren, so dass, wenn das Objekt vom GC entsorgt wird, die dispose-Methode aufgerufen wird. Dies verhindert den Zweck der Dispose-Methode (da die displace-Methode zum Freigeben untergeordneter Objekte verwendet wird, bevor das übergeordnete Objekt an den GC übergeben wird), aber Sie wissen, dass explizit von dieser Methode abgeschlossene Objekte aufgerufen werden.

bool disposed 

~Object 
{ 
    if(!disposed) 
     Dispose(); 
} 

Dispose and finalizers link

Another dispose and finalizers link (Joe Duffy)

+0

Kevin, wäre dies ein ähnliches Verhalten für ein C# -Steuerelement, das von einer C++ - App aufgerufen wird? Dass die C++ App explizit die dispose-Methode aufrufen müsste. –

+0

hmm Ich kann das nicht sicher sagen, da ich es noch nie aus einer C++ App gemacht habe, aber ich würde annehmen, dass du es immer noch von der C++ App aus aufrufen müsstest. – kemiller2002

2

Wenn Sie das Formular schließen, kann es nicht seine Dispose Methode sofort vom Garbage Collector aufgerufen haben (es sei denn, es in einem using Block lebt).

jedoch ist es ausreichend, Dispose Methode des Formulars aufzurufen, da das wird (schließlich) in seiner Controls Sammlung Dispose auf alle Bedienelemente Call (und jede Steuerung wird wiederum Anruf Dispose auf alle Bedienelemente in ihrer Sammlung Bedienelemente und so on), so wird am Ende auch die Dispose-Methode von UserControl aufgerufen.

0

Wenn Sie das Formular schließen, wenn das Modell nicht geöffnet wurde, ruft das Framework die Dispose-Methode auf. Wenn es durch einen Aufruf von ShowModel geöffnet wurde, müssen Sie die Methode Dispose separat aufrufen.

Wenn Ihr UserControl der Auflistung der Steuerelemente des Formulars hinzugefügt wurde, wird beim Ausführen der Dispose-Methode des Formulars auch Dispose für Ihr Benutzersteuerelement aufgerufen.