IDisposable.Dispose Methode

Definitie

Voert door de toepassing gedefinieerde taken uit die zijn gekoppeld aan het vrijmaken, vrijgeven of opnieuw instellen van onbeheerde resources.

public:
 void Dispose();
public void Dispose();
abstract member Dispose : unit -> unit
Public Sub Dispose ()

Voorbeelden

In het volgende voorbeeld ziet u hoe u de Dispose methode kunt implementeren.

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(disposing: true);
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SuppressFinalize 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# finalizer syntax for finalization code.
        // This finalizer will run only if the Dispose method
        // does not get called.
        // It gives your base class the opportunity to finalize.
        // Do not provide finalizer in types derived from this class.
        ~MyResource()
        {
            // Do not re-create Dispose clean-up code here.
            // Calling Dispose(disposing: false) is optimal in terms of
            // readability and maintainability.
            Dispose(disposing: false);
        }
    }
    public static void Main()
    {
        // Insert code here to create
        // and use the MyResource object.
    }
}
// The following example demonstrates how to create
// a resource class that implements the IDisposable interface
// and the IDisposable.Dispose method.
open System
open System.ComponentModel
open System.Runtime.InteropServices

// Use interop to call the method necessary
// to clean up the unmanaged resource.
[<DllImport "Kernel32">]
extern Boolean CloseHandle(nativeint handle)

// A base class that implements IDisposable.
// By implementing IDisposable, you are announcing that
// instances of this type allocate scarce resources.
type MyResource(handle: nativeint) =
    // Pointer to an external unmanaged resource.
    let mutable handle = handle

    // Other managed resource this class uses.
    let comp = new Component()
    
    // Track whether Dispose has been called.
    let mutable disposed = false

    // Implement IDisposable.
    // Do not make this method virtual.
    // A derived class should not be able to override this method.
    interface IDisposable with
        member this.Dispose() =
            this.Dispose true
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SuppressFinalize 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.
    abstract Dispose: bool -> unit
    override _.Dispose(disposing) =
        // Check to see if Dispose has already been called.
        if not disposed then
            // If disposing equals true, dispose all managed
            // and unmanaged resources.
            if disposing then
                // Dispose managed resources.
                comp.Dispose()

            // Call the appropriate methods to clean up
            // unmanaged resources here.
            // If disposing is false,
            // only the following code is executed.
            CloseHandle handle |> ignore
            handle <- IntPtr.Zero

            // Note disposing has been done.
            disposed <- true


    // This finalizer will run only if the Dispose method
    // does not get called.
    // It gives your base class the opportunity to finalize.
    // Do not provide finalizer in types derived from this class.
    override this.Finalize() =
        // Do not re-create Dispose clean-up code here.
        // Calling Dispose(disposing: false) is optimal in terms of
        // readability and maintainability.
        this.Dispose false
Imports 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 class that implements IDisposable.
   ' By implementing IDisposable, you are announcing that
   ' instances of this type allocate scarce resources.
   Public Class MyResource
      Implements IDisposable
      ' Pointer to an external unmanaged resource.
      Private handle As IntPtr
      ' Other managed resource this class uses.
      Private component As component
      ' Track whether Dispose has been called.
      Private disposed As Boolean = False

      ' The class constructor.
      Public Sub New(ByVal handle As IntPtr)
         Me.handle = handle
      End Sub

      ' Implement IDisposable.
      ' Do not make this method virtual.
      ' A derived class should not be able to override this method.
      Public Overloads Sub Dispose() Implements IDisposable.Dispose
         Dispose(disposing:=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(Me)
      End Sub

      ' 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 Overridable Overloads Sub Dispose(ByVal disposing As Boolean)
         ' Check to see if Dispose has already been called.
         If Not Me.disposed Then
            ' If disposing equals true, dispose all managed
            ' and unmanaged resources.
            If disposing Then
               ' Dispose managed resources.
               component.Dispose()
            End If

            ' 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

         End If
      End Sub

      ' Use interop to call the method necessary
      ' to clean up the unmanaged resource.
      <System.Runtime.InteropServices.DllImport("Kernel32")> _
      Private Shared Function CloseHandle(ByVal handle As IntPtr) As [Boolean]
      End Function

      ' This finalizer will run only if the Dispose method
      ' does not get called.
      ' It gives your base class the opportunity to finalize.
      ' Do not provide finalize methods in types derived from this class.
      Protected Overrides Sub Finalize()
         ' Do not re-create Dispose clean-up code here.
         ' Calling Dispose(disposing:=False) is optimal in terms of
         ' readability and maintainability.
         Dispose(disposing:=False)
         MyBase.Finalize()
      End Sub
   End Class

   Public Shared Sub Main()
      ' Insert code here to create
      ' and use the MyResource object.
   End Sub

End Class

Opmerkingen

Gebruik deze methode om onbeheerde resources, zoals bestanden, streams en ingangen, te sluiten of vrij te geven die worden bewaard door een instantie van de klasse die deze interface implementeert. Deze methode wordt standaard gebruikt voor alle taken die zijn gekoppeld aan het vrijmaken van resources die door een object worden bewaard of voor het voorbereiden van een object voor hergebruik.

Waarschuwing

Als u een klasse gebruikt waarmee de interface wordt geïmplementeerd, moet u de IDisposableDispose implementatie aanroepen wanneer u klaar bent met het gebruik van de klasse. Zie de sectie 'Using an object that implements IDisposable' (Een object gebruiken dat IDisposable implementeert) in het IDisposable onderwerp voor meer informatie.

Zorg er bij het implementeren van deze methode voor dat alle bewaarde resources worden vrijgemaakt door de aanroep door te geven via de insluitingshiërarchie. Als een object A bijvoorbeeld een object B toewijst en object B een object C toewijst, moet de implementatie van Dispose A een aanroep Dispose van B aanroepenDispose. Dit moet C inschakelen.

Important

De C++-compiler ondersteunt deterministische verwijdering van resources en staat geen directe implementatie van de Dispose methode toe.

Een object moet ook de methode van de Dispose basisklasse aanroepen als de basisklasse wordt geïmplementeerd IDisposable. Zie de sectie IDisposable en de overnamehiërarchie in het IDisposable onderwerp voor meer informatie over het implementeren IDisposable op basisklassen en de bijbehorende subklassen.

Als de Dispose methode van een object meerdere keren wordt aangeroepen, moet het object alle aanroepen na de eerste negeren. Het object mag geen uitzondering genereren als de methode Dispose meerdere keren wordt aangeroepen. Andere exemplaarmethoden dan Dispose kunnen een ObjectDisposedException instantiemethode werpen wanneer resources al worden verwijderd.

Gebruikers verwachten mogelijk dat een resourcetype een bepaalde conventie gebruikt om een toegewezen status aan te geven versus een vrije status. Een voorbeeld hiervan zijn streamklassen, die traditioneel worden beschouwd als open of gesloten. De implementeerfunctie van een klasse met een dergelijke conventie kan ervoor kiezen om een openbare methode te implementeren met een aangepaste naam, zoals Close, die de Dispose methode aanroept.

Omdat de Dispose methode expliciet moet worden aangeroepen, bestaat er altijd een gevaar dat de niet-beheerde resources niet worden vrijgegeven, omdat de consument van een object de methode niet kan aanroepen Dispose . Er zijn twee manieren om dit te voorkomen:

  • Verpakt de beheerde resource in een object dat is afgeleid van System.Runtime.InteropServices.SafeHandle. Uw Dispose implementatie roept vervolgens de Dispose methode van de System.Runtime.InteropServices.SafeHandle exemplaren aan. Zie de sectie 'The SafeHandle alternative' in het Object.Finalize onderwerp voor meer informatie.

  • Implementeer een finalizer voor gratis resources wanneer Dispose deze niet wordt aangeroepen. Standaard roept de garbagecollector automatisch de finalizer van een object aan voordat het geheugen wordt vrijgemaakt. Als de Dispose methode echter is aangeroepen, is het meestal niet nodig voor de garbagecollector om de finalizer van het verwijderde object aan te roepen. Om automatische afronding te voorkomen, Dispose kunnen implementaties de GC.SuppressFinalize methode aanroepen.

Wanneer u een object gebruikt dat toegang heeft tot onbeheerde resources, zoals een StreamWriter, is het raadzaam om het exemplaar te maken met een using instructie. De using instructie sluit de stream automatisch en roept Dispose het object aan wanneer de code die het gebruikt, is voltooid. Zie de StreamWriter klasse voor een voorbeeld.

Van toepassing op

Zie ook