IDisposable?



  • hi,
    was hat es mit dem interface IDisposable auf sich? Wann muss eine Klasse dieses interface implementieren?

    danke im voraus
    :schland:



  • Das musst du nicht implementieren. Es macht auch nur sinn wenn du auf unmanaged resourcen zugreifst.

    MSDN schrieb:

    IDisposable Interface
    Defines a method to release allocated unmanaged resources.

    The garbage collector automatically releases the memory allocated to a managed object when that object is no longer used, however, it is not possible to predict when garbage collection will occur. Furthermore, the garbage collector has no knowledge of unmanaged resources such as window handles, or open files and streams.



  • BeginnerC# schrieb:

    Wann muss eine Klasse dieses interface implementieren?

    1. Fall: Dann, wenn du eine Klasse schreibst, die ein Betriebssystem-Handle kapselt. Meistens wirst du solche Klassen eher nur benutzen.

    2. Fall: Wenn du eine Klasse schreibst, die mehrere IDisposable-Objekte für sich erzeugt und benutzt. Dann solltest du Dispose() anbieten, um die intern genutzten Resourcen disposen zu lassen. Zum Beispiel könntest du eine Klasse schreiben, die eine Malfläche darstellt, auf der man dann Kreise, Linien und Text malen kann. Diese Klasse würde intern ne Bitmap und Pens und Brushes konstruieren und nach außen nur DrawCircle() anbieten. Ein Aufruf von Malfläche.Dispose() sollte dann alles aufräumen.



  • danke, wird dieses Dispose dann automatisch von GC aufgerufen oder muss man das selbst aufrufen?



  • Edit:
    Hast Recht, die Methode "Dispose" wird nicht automatisch vom GC aufgerufen, sollte aber im Finalizer aufgerufen werden, falls das Objekt noch nicht vorher "disposed" wurde.

    Aber du mußt auch IDisposable implementieren, wenn du eine Klasse mit der using-Anweisung benutzen willst,
    z.B.

    using(new MyDisposableClass())
    {
    
    } // <- hier wird jetzt Dispose aufgerufen und das Objekt gelöscht
    


  • Nein, Dispose() wird nicht automatisch aufgerufen. Was automatisch aufgerufen wird, ist Finalize(), das kann dann Dispose() aufrufen (musst du aber selber so coden). Nur IDisposable implementieren reicht dann nicht.

    Der Sinn von Dispose() ist aber gerade eben, nicht auf den GC zu warten, also Dispose() im Code aufzurufen.
    http://msdn2.microsoft.com/en-us/library/fs2xkftw.aspx
    http://msdn2.microsoft.com/en-us/library/ddae83kx.aspx


Anmelden zum Antworten