Markieren Sie das Kontrollkästchen Englisch, um die englische Version dieses Artikels anzuzeigen. Sie können den englischen Text auch in einem Popup-Fenster einblenden, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch
Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

IDisposable.Dispose-Methode

Führt anwendungsspezifische Aufgaben aus, die mit dem Freigeben, Zurückgeben oder Zurücksetzen von nicht verwalteten Ressourcen zusammenhängen.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

void Dispose()

Mit dieser Methode werden nicht verwaltete Ressourcen wie Dateien, Streams und Handles, die für eine Instanz der diese Schnittstelle implementierenden Klasse reserviert sind, geschlossen oder freigegeben. Diese Methode wird traditionell für alle Aufgaben verwendet, die mit der Freigabe der für ein Objekt reservierten Ressourcen oder mit der Vorbereitung der Wiederverwendung eines Objekts zusammenhängen.

Wichtiger HinweisWichtig

C++-Programmierer sollten Destructors and Finalizers in Visual C++ lesen. In .NET Framework, Version 2.0, bietet der C++-Compiler Unterstützung, um das deterministische Verwerfen von Ressourcen zu implementieren. Die direkte Implementierung der Dispose-Methode wird nicht unterstützt.

Stellen Sie bei Implementierung dieser Methode sicher, dass alle reservierten Ressourcen freigegeben werden, indem der Aufruf durch die Kapselungshierarchie weitergeleitet wird. Zum Beispiel wenn ein Objekt A ein Objekt B zuordnet, und Objekt B Objekt C zuordnet, dann muss die Dispose-Implementierung von A Dispose für B aufrufen, der dann Dispose für C aufrufen muss. Ein Objekt muss auch die Dispose-Methode seiner Basisklasse aufrufen, wenn die Basisklasse IDisposable implementiert.

Wenn die Dispose-Methode eines Objekts mehrfach aufgerufen wird, muss das Objekt alle auf den ersten Aufruf folgenden Aufrufe ignorieren. Das Objekt darf keine Ausnahme auslösen, wenn seine Dispose-Methode mehrmals aufgerufen wird. Andere Instanzmethoden als Dispose können eine ObjectDisposedException auslösen, wenn Ressourcen bereits verworfen wurden.

Möglicherweise erwarten die Benutzer, dass ein Ressourcentyp eine bestimmte Vereinbarung zur Unterscheidung zwischen einer zugeordneten und einer freigegebenen Ressource verwendet. Ein Beispiel hierfür sind Streamklassen, von denen traditionell als geöffnet oder geschlossen gesprochen wird. Wenn eine Klasse mit einer derartigen Vereinbarung implementiert wird, kann auch eine öffentliche Methode mit einem benutzerdefinierten Namen (z. B. Schließen) implementiert werden, um die Dispose-Methode aufzurufen.

Da die Dispose-Methode explizit aufgerufen werden muss, müssen Objekte, die IDisposable implementieren, auch einen Finalizer implementieren, der die Freigabe der Ressourcen übernimmt, wenn Dispose nicht aufgerufen wird. In der Standardeinstellung ruft der Garbage Collector vor der Rückgabe des Speichers für ein Objekt dessen Finalizer auf. Nach dem Aufruf der Dispose-Methode ist es allerdings i. d. R. überflüssig, dass der Garbage Collector zusätzlich den Finalizer des freigegebenen Objekts aufruft. Implementierungen von Dispose können die GC.SuppressFinalize-Methode aufrufen, um die automatische Finalisierung zu verhindern.

Weitere Informationen zum Implementieren der Finalizer und der Dispose-Methode finden Sie in der GC-Klasse, in der Object.Finalize-Methode und unter Implementieren der Methoden "Finalize" und "Dispose" zum Bereinigen von nicht verwalteten Ressourcen.

Wenn Sie ein Objekt verwenden, das auf nicht verwaltete Ressourcen, z. B. ein StreamWriter, zugreift, ist eine empfohlene Vorgehensweise, die Instanz mit einer using-Anweisung zu erstellen. Die using-Anweisung schließt automatisch den Stream und ruft Dispose für das Objekt auf, wenn der Code, in dem das Objekt verwendet wird, abgeschlossen wurde. Ein Beispiel finden Sie unter der StreamWriter-Klasse.

Im folgenden Beispiel wird die Implementierung der Dispose-Methode veranschaulicht.


using System;
using System.ComponentModel;

// The following example demonstrates how to create
// a resource class that implements the IDisposable interface
// and the IDisposable.Dispose method.

public class DisposeExample
{
    // A base class that implements IDisposable.
    // By implementing IDisposable, you are announcing that
    // instances of this type allocate scarce resources.
    public class MyResource: IDisposable
    {
        // Pointer to an external unmanaged resource.
        private IntPtr handle;
        // Other managed resource this class uses.
        private Component component = new Component();
        // Track whether Dispose has been called.
        private bool disposed = false;

        // The class constructor.
        public MyResource(IntPtr handle)
        {
            this.handle = handle;
        }

        // Implement IDisposable.
        // Do not make this method virtual.
        // A derived class should not be able to override this method.
        public void Dispose()
        {
            Dispose(true);
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
        }

        // Dispose(bool disposing) executes in two distinct scenarios.
        // If disposing equals true, the method has been called directly
        // or indirectly by a user's code. Managed and unmanaged resources
        // can be disposed.
        // If disposing equals false, the method has been called by the
        // runtime from inside the finalizer and you should not reference
        // other objects. Only unmanaged resources can be disposed.
        protected virtual void Dispose(bool disposing)
        {
            // Check to see if Dispose has already been called.
            if(!this.disposed)
            {
                // If disposing equals true, dispose all managed
                // and unmanaged resources.
                if(disposing)
                {
                    // Dispose managed resources.
                    component.Dispose();
                }

                // Call the appropriate methods to clean up
                // unmanaged resources here.
                // If disposing is false,
                // only the following code is executed.
                CloseHandle(handle);
                handle = IntPtr.Zero;

                // Note disposing has been done.
                disposed = true;

            }
        }

        // Use interop to call the method necessary
        // to clean up the unmanaged resource.
        [System.Runtime.InteropServices.DllImport("Kernel32")]
        private extern static Boolean CloseHandle(IntPtr handle);

        // Use C# destructor syntax for finalization code.
        // This destructor will run only if the Dispose method
        // does not get called.
        // It gives your base class the opportunity to finalize.
        // Do not provide destructors in types derived from this class.
        ~MyResource()
        {
            // Do not re-create Dispose clean-up code here.
            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.
            Dispose(false);
        }
    }
    public static void Main()
    {
        // Insert code here to create
        // and use the MyResource object.
    }
}


.NET Framework

Unterstützt in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Unterstützt in:

Windows 7, Windows Vista SP1 oder höher, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (Server Core wird nicht unterstützt), Windows Server 2008 R2 (Server Core wird mit SP1 oder höher unterstützt), Windows Server 2003 SP2

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.
Anzeigen: