2009-09-14 7 views
5

Czy istnieje sposób "automatycznego" uruchomienia kodu finalizacji/destruktora, gdy tylko zmienna traci zasięg w języku .Net? Wydaje mi się, że ponieważ garbage collector działa w nieokreślonym czasie, kod destruktora nie jest uruchamiany, gdy zmienna traci zasięg. Zdaję sobie sprawę, że mógłbym dziedziczyć z IDisposable i jawnie wywoływać Dispose na moim obiekcie, ale miałem nadzieję, że może istnieć bardziej praktyczne rozwiązanie, podobne do sposobu, w jaki nie-sieć C++ radzi sobie z niszczeniem obiektów.Czy kod może być uruchamiany, gdy obiekt znajdzie się poza zakresem w .Net?

pożądanego zachowania (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(); 
} 

mniej pożądane:

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(); 
    } 
} 

Odpowiedz

9

Using konstrukt pochodzi najbliżej tego, co chcesz:

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

Dispose() jest wywoływana automatycznie, nawet jeśli wystąpił wyjątek. Ale twoja klasa musi wdrożyć IDisposable.

Ale to nie znaczy, że obiekt został usunięty z pamięci. Nie masz nad tym kontroli.

+0

(+1) Warto zauważyć, że "używanie" jest skrótem do wykorzystania metody Dispose, a nie do wykorzystania destruktora i usunięcia obiektu z pamięci. –

4

użyciu słów kluczowych z obiektem wykonawczego IDisposable właśnie to robi.

Na przykład:

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

ten został zastąpiony przez kompilator do:

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

Niestety, nie.

Twoja najlepsza opcja to implementacja IDisposable z IDisposable pattern.

+0

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

Powiązane problemy