Можно ли выполнить код, когда объект выходит из области видимости в .Net? - PullRequest
5 голосов
/ 14 сентября 2009

Есть ли способ "автоматически" запустить код завершения / деструктора, как только переменная потеряет область видимости в языке .Net? Мне кажется, что, поскольку сборщик мусора работает в неопределенное время, код деструктора не запускается, как только переменная теряет область видимости. Я понимаю, что могу унаследовать от IDisposable и явно вызывать Dispose для моего объекта, но я надеялся, что может быть более простое решение, подобное тому, как non-.Net C ++ обрабатывает уничтожение объекта.

Желаемое поведение (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();
}

Менее желательно:

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

Ответы [ 3 ]

9 голосов
/ 14 сентября 2009

Конструкция с использованием наиболее близка к тому, что вы хотите:

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

Dispose () вызывается автоматически, даже если произошло исключение. Но ваш класс должен реализовать IDisposable.

Но это не значит, что объект удален из памяти. Вы не можете это контролировать.

4 голосов
/ 14 сентября 2009

Ключевое слово using с объектом, реализующим IDisposable, делает именно это.

Например:

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

Это заменяется компилятором на:

FileStream stream = new FileStream("string", FileMode.Open);
try
{
    // Some code
}
finally
{
    stream.Dispose();
}
3 голосов
/ 14 сентября 2009

К сожалению, нет.

Ваш лучший вариант - реализовать IDisposable с шаблоном IDisposable .

...