C # 2008
Ich arbeite jetzt schon eine Weile daran und bin immer noch verwirrt über die Verwendung von Finalize- und Dispose-Methoden im Code. Meine Fragen sind unten:
Ich weiß, dass wir nur einen Finalizer benötigen, wenn wir nicht verwaltete Ressourcen entsorgen. Wenn jedoch verwaltete Ressourcen vorhanden sind, die nicht verwaltete Ressourcen aufrufen, muss dann noch ein Finalizer implementiert werden?
Wenn ich jedoch eine Klasse entwickle, die keine nicht verwalteten Ressourcen verwendet - direkt oder indirekt, sollte ich die implementieren
IDisposable
, damit die Clients dieser Klasse die Anweisung 'using' verwenden können?Wäre es möglich, IDisposable zu implementieren, damit Clients Ihrer Klasse die using-Anweisung verwenden können?
using(myClass objClass = new myClass()) { // Do stuff here }
Ich habe diesen einfachen Code unten entwickelt, um die Verwendung von Finalize / Dispose zu demonstrieren:
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
Frage zum Quellcode:
Hier habe ich den Finalizer nicht hinzugefügt, und normalerweise wird der Finalizer vom GC aufgerufen, und der Finalizer ruft Dispose auf. Wann rufe ich die Dispose-Methode auf, da ich den Finalizer nicht habe? Ist es der Client der Klasse, der es aufrufen muss?
Meine Klasse im Beispiel heißt also NoGateway, und der Client kann die Klasse folgendermaßen verwenden und entsorgen:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
Würde die Dispose-Methode automatisch aufgerufen, wenn die Ausführung das Ende des using-Blocks erreicht, oder muss der Client die dispose-Methode manuell aufrufen? dh
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
Ich benutze die
WebClient
Klasse in meinerNoGateway
Klasse. DaWebClient
die Geräte -IDisposable
Schnittstelle, bedeutet das , dieWebClient
indirekt von nicht verwalteten Ressourcen verwendet? Gibt es eine feste Regel, um dies zu befolgen? Woher weiß ich, dass eine Klasse nicht verwaltete Ressourcen verwendet?