Как одноразовый класс может определить, есть ли исключение в процессе? - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть класс, который реализует IDisposable

public class Foo: IDisposable {
    public void Dispose() {
        // do the disposing
    }
}

Тогда у меня есть метод, который использует класс следующим образом:

void Bar() {
    using (var f = new Foo()) {
       // do whatever
    }  
}

Когда код покидает границу использования {...}, вызывается метод Dispose для класса Foo. Как я могу определить в методе Dispose, покидает ли код использование блока добровольно или в результате исключения?

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

Вы не можете, насколько мне известно. Рассмотрите возможность изменения Foo на метод, который принимает «тело» для переноса и выполнения в виде лямбды:

Foo(f => {
    // do whatever
});

Затем ваша реализация Foo может заключить вызов в try/catch, чтобы обнаружить исключения и сделать все, что вы хотите сделать (а затем сбросить с помощью throw;).

0 голосов
/ 13 ноября 2009

Ты не должен этого делать - и я не могу представить, как это сделать.

Основная идея реализации IDisposable - обеспечить освобождение ресурсов при уничтожении объекта.

Теперь основная идея конструкции using состоит в том, чтобы после нее все ресурсы, используемые объектом, были освобождены.

Итак, вы не должны зависеть от , почему объект располагается для выполнения этой операции. Если вы это сделаете, вы должны пересмотреть свой дизайн.

...