2010-08-06 5 views

Antwort

7

Nein. Jedes normal verwaltete .NET-Objekt wird mit Garbage Collection gesammelt, wenn Sie nicht mehr darauf verweisen. IDisposable bedeutet, dass Sie eine Dispose() -Methode implementieren, die vom Aufrufer aufgerufen werden muss - normalerweise werden Dinge freigegeben, die nicht gesammelt wurden. Es hilft auch mit einem deterministischen Ort, um Speicher freizugeben.

Überprüfen Sie die IDisposable Muster, um sicherzustellen, dass Sie es richtig:

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2006/09/21/10887.aspx

+0

Vielen Dank für Ihre Antwort. Wenn ich also eine Klasse A habe und eine ihrer öffentlichen Funktionen ein nicht verwaltetes Objekt wie Bitmap erstellt und BitMap.Dispose() aufruft, wird dann Garbage Collected gesammelt oder behält die Klasse A einen Verweis auf die Bitmap? – kishore

+0

Wenn Sie Dispose() aufrufen, wird es in diesem Fall entsorgt (das Objekt ist jetzt unbrauchbar). Wenn nicht, würde der GC schließlich dazu kommen, und wenn es richtig geschrieben wurde (war es), wird das Finalize Dispose() aufrufen. Der Aufruf von Dispose() ist jedoch erforderlich (verwenden Sie die using-Anweisung, um dies automatisch zu tun). –

+0

Sie sollten IDisposable auch nicht implementieren, es sei denn, Sie müssen dies tun. Es macht den GC langsamer, sich mit ihnen auseinandersetzen zu müssen (denken Sie daran, Finalize aufzurufen usw.). Wenn Sie über eine Eigenschaft verfügen, bei der es sich um verfügbare oder nicht verwaltete Ressourcen handelt, implementieren Sie sie. –

3

Nein, jedes Objekt wird automatisch entsorgt.

IDisposable ist verwendbar, wenn Sie eine spezielle Operation zur Dekonstruktion des Objekts ausführen müssen. Wenn Sie zum Beispiel während der Arbeit Ihres Objekts Ressourcen wie Dateien sperren, können Sie sie in Ihrer Dispose-Methode freigeben.

1

IDisposable muss verwendet werden, wenn Sie eine native Ressource wie einen Dateistream in Ihrem Code verwenden möchten. Für alle anderen Zwecke leistet der Garbage Collector von .Net gute Arbeit.

Durch einfaches Implementieren von IDisposable wird keine Speicherbereinigung erzwungen. Die Dispose-Methode muss explizit aufgerufen werden, um eine systemeigene Ressource zu bereinigen.

Edit: Ich werde Ihnen raten, das Garbage Collection Kapitel in ClR via C# von Jeff Richter zu gehen.

1

Nein. Ihre benutzerdefinierte Klasse ist eine Sammlungsgruppe, wenn sie nirgendwo mehr referenziert wird. Sie können dies erzwingen, indem Sie einfach classObject = null tun. Wenn dies der letzte Teil der Anwendung ist, die derzeit auf classObject verweist, löscht die Speicherbereinigung ihren Speicher.

IDisposable wird meist verwendet, damit Sie die Garbage Collection-Aktivitäten über die using() Methoden organisieren können.

1

Nein, tut es nicht. Die Methode Dispose() wurde entwickelt, um zusätzliche Arbeit zu leisten und Ressourcen zu entsorgen, die entsorgt werden müssen, wenn das Objekt nicht mehr benutzt wird. Denken Sie daran, dass der gesammelte Müll eine lange Zeit nach dem Verlust der letzten Referenz des Objekts passieren kann.

Wenn die IDisposable verwendet wird Sie das Objekt verfügen sollte, wenn Ihr mit fx getan using wie

using (SomeClassWithDisp object = new SomeClassWithDisp()) 
{ 
    //Use the object 
} 

Auch sehen:

What is the difference between using IDisposable vs a destructor in C#?

1

In .NET sollten alle Objekte freigegeben werden aus dem Speicher mit der Garbage Collector standardmäßig, solange sie nicht mehr verwendet werden, so dass Sie IDisposable nicht für jede Klasse implementieren müssen, aber es ist gut, eine Art Memo zu haben ry Release-Mechanismus, wie ein Destruktor oder die Dispose-Methode selbst.

Dies ist ein gutes Beispiel für einen destructor verwendet: http://www.developer.com/net/csharp/article.php/3343191/C-Tip-Forcing-Garbage-Collection-in-NET.htm

1

Die dispose() -Methode Sie implementieren verwendete nicht verwalteten Ressourcen explizit freizugeben (Dateien, Bäche, Griffe, usw.), an dem das Objekt hält eine Referenz.

Die Idee ist, dass Sie diese Ressourcen so schnell wie möglich freigeben, indem Sie die dispose-Methode aufrufen. Die dispose() - Methode führt nicht SOFORT eine Garbage-Collection für Ihr Objekt aus, sondern gibt die Ressourcen frei und ermöglicht es dem Garbage Collector, seine Sache zu erledigen, wenn sie dafür geeignet ist.

Verwandte Themen