Gute Beispiele für die Verwendung von Finalizern in C #

8

Als ich ein paar Artikel über Speicherverwaltung in C # gelesen habe, war ich von Finalizer-Methoden verwirrt.

Es gibt so viele komplizierte Regeln, die sich auf sie beziehen. Zum Beispiel weiß niemand, wenn die Finalizer aufgerufen werden, sie aufgerufen, auch wenn Code in Ctor wirft, CLR garantiert nicht, dass alle Finalizer aufgerufen werden, wenn Programme shutdowt usw ..

Welche Finalizer können im echten Leben verwendet werden?

Das einzige Beispiel, das ich gefunden habe, war ein Programm, das piept, wenn der GC startet.

Verwenden Sie Finalizer in Ihrem Code und können einige gute Beispiele haben?

UPD:

Finalizer können verwendet werden, wenn Entwickler sicherstellen möchten, dass einige Klassen immer korrekt über IDisposable verteilt werden. ( link ; Danke Steve Townsend )

    
mt_serg 03.11.2010, 15:09
quelle

2 Antworten

4

Es gibt eine ausführliche Diskussion der Verwendung von Finalizer mit Beispielen hier . Link mit freundlicher Genehmigung von @SLaks unter eine entsprechende Antwort.

Siehe auch hier für eine genauere Zusammenfassung, wann Sie eine benötigen (was " nicht sehr häufig").

Es gibt eine nette vorherige Antwort hier mit einem anderen guten Beispiel aus der Praxis.

Zusammenfassend mit einem entsprechenden Auszug:

  

Finalisten werden benötigt, um das zu garantieren   Freisetzung von knappen Ressourcen zurück in   das Betriebssystem wie Dateigriffe, Sockets,   Kernel-Objekte, etc.

Durchsuchen Sie für weitere korrekte Beispiele aus der Praxis die betroffenen Klassen im .NET Framework nach dieser MSDN-Suche:

Ссылка

Ein wichtiger Grund, den ich mir vorstellen kann, wenn Sie einen Finalizer benötigen, ist, wenn Sie eine native Code-API eines Drittanbieters in einen verwalteten Wrapper einbinden und die zugrunde liegende API-Bibliothek für den nativen Code die rechtzeitige Freigabe der verwendeten Betriebssystemressourcen erfordert .

    
Steve Townsend 03.11.2010, 15:12
quelle
3

Die beste mir bekannte Praxis ist einfach, benutze sie nicht. Es kann jedoch einige Eckfälle geben, wenn Sie einen Finalizer verwenden möchten, insbesondere wenn es um nicht verwaltete Objekte geht und Sie kein Dispose-Muster implementieren können (ich kenne keine alten Probleme), dann können Sie Finalize method mit Vorsicht implementieren (und es könnte die Leistung Ihres Systems reduzieren, Ihre Objekte untot machen und andere möglicherweise seltsame Szenarios, die Ausnahmen beachten, da sie nicht auffindbar sind:)).

Schreiben Sie in 99% der Fälle einfach das Dispose-Muster verwenden und verwenden Sie diese Methode, um nach sich selbst zu säubern und alles wird gut.

    
luckyluke 03.11.2010 15:20
quelle