2009-09-14 7 views
5

Gibt es eine Möglichkeit, Finalisierungs-/Destruktorcode "automatisch" auszuführen, sobald eine Variable den Umfang in einer .Net-Sprache verliert? Es scheint mir, dass der Destruktorcode nicht ausgeführt wird, sobald der Garbage Collector zu einem unbestimmten Zeitpunkt ausgeführt wird, sobald die Variable den Gültigkeitsbereich verliert. Mir ist klar, dass ich von IDisposable erben und explizit Dispose für mein Objekt aufrufen könnte, aber ich hatte gehofft, dass es eine Lösung mit mehr Händen geben könnte, ähnlich wie non.Net C++ die Objektzerstörung behandelt.Kann Code ausgeführt werden, wenn ein Objekt in .Net aus dem Gültigkeitsbereich fällt?

Wunschverhalten (C#):

public class A { 
    ~A { [some code I would like to run] } 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
    // At this point, I would like my destructor code to have already run. 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
} 

Weniger wünschenswert:

public class A : IDisposable { 
    [ destructor code, Dispose method, etc. etc.] 
} 

public void SomeFreeFunction() { 
    SomeFreeSubFunction(); 
} 

public void SomeFreeSubFunction() { 
    A myA = new A(); 
    try { 
     ... 
    } 
    finally { 
     myA.Dispose(); 
    } 
} 

Antwort

9

Die Verwendung Konstrukt am nächsten kommt, was Sie wollen:

using (MyClass o = new MyClass()) 
{ 
... 
} 

Dispose() ist automatisch aufgerufen, auch wenn eine Ausnahme aufgetreten ist. Aber Ihre Klasse muss IDisposable implementieren.

Aber das bedeutet nicht, dass das Objekt aus dem Speicher entfernt wird. Du hast keine Kontrolle darüber.

+0

(+1) Gut zu wissen, dass "verwenden" eine Abkürzung für die Verwendung der Dispose-Methode ist und nicht für die Verwendung des Destruktors und das Entfernen des Objekts aus dem Speicher. –

4

Die Verwendung von Keyword mit einem Objekt der Umsetzung IDisposable genau das tut.

Zum Beispiel:

using(FileStream stream = new FileStream("string", FileMode.Open)) 
{ 
    // Some code 
} 

Dies wird durch den Compiler ersetzt:

FileStream stream = new FileStream("string", FileMode.Open); 
try 
{ 
    // Some code 
} 
finally 
{ 
    stream.Dispose(); 
} 
3

Leider nein.

Ihre beste Option ist es IDisposable mit der IDisposable pattern zu implementieren.

+0

Siehe auch http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae – TrueWill