2010-05-15 7 views
5

In C# ist es möglich, schwachen Verweis auf Objekte zu erstellen, wie hier beschrieben:Schwache Verweise und Einweg-Objekte

WeakReference Class

In .net implementieren einige Klassen auch die IDisposable-Schnittstelle. Der Aufruf der Dispose-Methode dieser Schnittstelle wird ausgeführt, um verwaltete oder nicht verwaltete Ressourcen, auf denen aktuell festgehalten wird, manuell zu entfernen. Ein Beispiel könnte ein Bitmap-Objekt oder eine Bitmap-Klasse sein.

Wenn ich ein Objekt, das IDisposable zu einer schwachen Referenz implementiert, zuweisen, wird Dispose aufgerufen, wenn die schwache Referenz das Objekt sammelt?

+2

Was meinst du mit „WeakReference“ seine Objekte zu sammeln? es ist nur eine schwache Referenz, d. h. das Objekt, auf das es zeigt, kann durch den Speicherbereiniger gesammelt werden. In diesem Fall gilt alles, was Sie über den Garbage Collector wissen ... – flq

+0

Wie Frank sagte, wird das Objekt nur vom Garbage Collector gesammelt. Dies wird wiederum den Finalizer auslösen, wenn Sie einen solchen haben. Die Dispose-Methode wird jedoch niemals ausgelöst. – Steffen

Antwort

5

Im Allgemeinen ist die Antwort in der Tat Nr

jedoch eine ordnungsgemäß umgesetzt Klasse, die IDisposable mit den IDisposable pattern (hopefuly alle .NET-Klassen dies tun) implementiert. Würde auch den Finalizer implementieren, der aufgerufen wird, wenn das Objekt als Garbage Collection erfasst wird, und im Finalizer Dispose aufrufen. Für alle geeigneten Implementierungen von IDisposable wird die Dispose-Methode aufgerufen.

(Anmerkung: das Gegenbeispiel von Fernando nicht IDisposable Umsetzung richtig)

+2

Eigentlich ruft der "Standard" Finalizer nur 'Dispose (bool)' '; 'Dispose()' wird nicht aufgerufen, sodass eine Bereinigung, die von verwaltetem Code abhängt (z. B. das Löschen der zugrunde liegenden Dateiströme), nicht durchgeführt werden kann. –

5

GC ruft niemals Dispose auf. Dispose muss vom Benutzercode aufgerufen werden.

+1

Ihr Entwurf möglicherweise besser gedient durch Ersetzen von 'WeakReference' mit' RefCountDisposable' aus der [Rx-Bibliothek] (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx). –

1

Nr Überprüfen dieser Test:

class Program { 
     static void Main(string[] args) { 
      Test test = new Test(); 
      Console.WriteLine(test.Disposable == null); 
      GC.Collect(); 
      Console.WriteLine(test.Disposable == null); 
      Console.ReadLine(); 
     } 
    } 

    public class Test { 
     private WeakReference disposable = new WeakReference(new WeakDisposable()); 
     public WeakDisposable Disposable { 
      get { return disposable.Target as WeakDisposable; } 
     } 
    } 

    public class WeakDisposable : IDisposable { 
     ~WeakDisposable() { 
      Console.WriteLine("Destructor"); 
     } 
     public void Dispose() { 
      Console.WriteLine("Dispose"); 
     } 
    } 

Die Ausgabe lautet:

False 
True 
Destructor 

Wie Sie sehen können, die Ausführung nie trifft die Dispose Methode.