Ich bin nicht sicher, wie die benutzerdefinierten Klassenobjekte Garbage Collected gesammelt werden. Muss ich die IDisposable-Schnittstelle für jede Klasse implementieren und die Methode dispose() aufrufen, um den Speicher freizugeben?Muss jede benutzerdefinierte Klasse IDisposable Schnittstelle implementieren, um Garbage Collected zu erhalten
Antwort
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
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.
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.
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.
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#?
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
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.
- 1. Klasse Design: Klasse implementieren eine Schnittstelle implementieren eine andere Schnittstelle
- 2. Intptr Handle sind nicht Garbage Collected
- 3. Muss eine Klasse sich an den dokumentierten Vertrag einer Schnittstelle halten, um diese Schnittstelle zu implementieren
- 4. JS: Profil Welche Objektkonstruktoren sind Garbage Collected
- 5. Implementieren IDisposable auf einer versiegelten Klasse
- 6. Benutzerdefinierte Klasse: Schnittstelle zu implementieren, um ordnungsgemäß mit LINQ zu arbeiten
- 7. Membervariable, die Klasse A erweitern und eine Schnittstelle implementieren muss
- 8. Soll ich IDisposable hier implementieren?
- 9. Ist es für eine Aktivität möglich, Garbage Collected und kein Kindfragment zu erhalten?
- 10. Um ein Objekt zu verhöhnen, muss es entweder eine Schnittstelle implementieren oder als virtuell markiert sein?
- 11. Kotlin Daten Klasse Java Schnittstelle implementieren
- 12. Objekt dispose in IDisposable Klasse
- 13. Erhalten Threads automatisch Garbage Collected nachdem die Methode run() in Java beendet wurde?
- 14. Kann ich Erweiterungsmethoden verwenden, um eine Schnittstelle zu implementieren?
- 15. jquery jede Funktion, um Eingabewerte zu erhalten
- 16. Schnittstelle implementieren mit Anonymous-Klasse in C++
- 17. Implementieren IDisposable - Einweg-Felder vs. Einweg-Eigenschaften
- 18. Django: Hochgeladene Dateien werden nicht mit Garbage Collected geladen, was zu Speicherproblemen führt.
- 19. TYPO3 6.2 Fehler '$ hookObject muss Schnittstelle implementieren' im Backend
- 20. Sollte ich GC.SupressFinalize auf IDisposable UND Finalisieren implementieren?
- 21. Wie IDisposable-Schnittstelle in einer Klasse implementiert, die von SocketAsyncEventArgs geerbt wird
- 22. Verwenden von Reflection.Emit, um generische Schnittstelle zu implementieren
- 23. Wie verwende ich Reflektion, um Eigenschaften zu erhalten, die explizit eine Schnittstelle implementieren? speziell
- 24. Entsorgen der Mitglieder, die IDisposable implementieren
- 25. meine eigene Schnittstelle in VBA Implementierung - Fehler: Objekt-Modul für die Schnittstelle ‚y‘ implementieren ‚x‘ muss
- 26. Implementieren der View.IOnTouchListener-Schnittstelle
- 27. Verfügt NUnit über Objekte, die IDisposable implementieren?
- 28. Implementieren Sie eine benutzerdefinierte COM-Schnittstelle in Java
- 29. Muss ich alle Benutzersteuerungseigenschaften per Schnittstelle in WPF implementieren?
- 30. JAXB generierte Klassen bestimmter Typen, die eine benutzerdefinierte Schnittstelle implementieren
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
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). –
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. –