我有一个实现IDisposable的类
public class Foo: IDisposable {
public void Dispose() {
// do the disposing
}
}
然后我有一个以下列方式使用该类的方法:
void Bar() {
using (var f = new Foo()) {
// do whatever
}
}
当代码离开using {...}边界时,将调用Foo类上的Dispose方法。如何在Dispose方法中检测代码是自愿使用块还是由于异常而离开?
答案 0 :(得分:1)
据我所知,你不能。考虑将Foo
更改为将“body”包装并作为lambda执行的方法:
Foo(f => {
// do whatever
});
然后,您的Foo
实现可以将调用包装到try/catch
中以检测异常并执行您想要执行的操作(然后使用throw;
重新抛出)。
答案 1 :(得分:0)
你不应该这样做 - 我无法想象有办法做到这一点。
实现IDisposable
的主要思想是确保在销毁对象时释放资源。
现在,using
构造的主要思想是确保在它之后释放对象使用的所有资源。
因此,您不应该依赖为什么正在处理该对象以执行此操作。如果你这样做,你应该检查你的设计。