(0) exportieren Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

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. Standardmäßig wird diese Methode für alle Aufgaben verwendet, die dem Freigeben von den Ressourcen zugeordnet werden, die von einem Objekt verwendet werden, oder das Vorbereiten eines Objekts zur Wiederverwendung.

WarnhinweisVorsicht

Wenn Sie eine Klasse verwenden, die die IDisposable-Schnittstelle implementiert, müssen Sie seine Dispose Implementierung aufrufen, wenn mit der Klasse beendet werden. Weitere Informationen finden Sie im Abschnitt "Verwenden eines Objekts, das Abschnitt IDisposable" im Thema IDisposable implementiert.

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.

Wichtiger HinweisWichtig

C++-Programmierer sollten Destruktoren und Finalizer in Visual C++ lesen. Der C++-Compiler unterstützt deterministische Freigabe von Ressourcen und lässt keine direkte Implementierung der Dispose-Methode.

Ein Objekt muss auch die Dispose-Methode seiner Basisklasse aufrufen, wenn die Basisklasse IDisposable implementiert. Weitere Informationen zum Implementieren von IDisposable in einer Basisklasse und seinen Unterklassen finden Sie im Abschnitt "IDisposable und der Vererbungshierarchie" im Thema IDisposable.

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. Die Implementierung einer Klasse, die eine solche Konvention hat, beschlösse werden, um eine öffentliche Methode mit benutzerdefiniertem Namen, wie Close zu implementieren, der die Dispose-Methode aufruft.

Da die Dispose-Methode explizit aufgerufen werden muss, gibt es immer eine Gefahr, dass die nicht verwaltete Ressourcen nicht freigegeben werden, da Consumer eines Objekts die Dispose-Methode nicht aufrufen kann. Es gibt zwei Möglichkeiten, dies zu verhindern:

  • Binden Sie die verwaltete Ressource in einem Objekt auf, das von System.Runtime.InteropServices.SafeHandle abgeleitet wird. Ihre Dispose Implementierung ruft dann die Dispose-Methode der System.Runtime.InteropServices.SafeHandle-Instanzen auf. Weitere Informationen finden Sie unter "alternativen" Abschnitt SafeHandle im Thema Object.Finalize.

  • Implementieren Sie einen Finalizer um Ressourcen freizugeben, wenn Dispose nicht aufgerufen wird. Standardmäßig ruft der Garbage Collector automatisch den Finalizer eines Objekts auf, bevor er den Speicher freigibt. Wenn die Dispose-Methode aufgerufen wurde, ist in der Regel nicht für die Garbage Collector, welcher Finalizer des verworfenen Objekts aufzurufen. Implementierungen von Dispose können die GC.SuppressFinalize-Methode aufrufen, um die automatische Finalisierung zu verhindern.

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.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

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

Community-Beiträge

HINZUFÜGEN
Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
Anzeigen:
© 2014 Microsoft