“ using ” 结构对于需要开始部分和单独结束部分的情况看起来非常方便。
快速示例来说明:
using (new Tag("body")) {
Trace.WriteLine("hello!");
}
// ...
class Tag : IDisposable {
String name;
public Tag(String name) {
this.name = name;
Trace.WriteLine("<" + this.name + ">");
Trace.Indent();
}
public void Dispose() {
Trace.Unindent();
Trace.WriteLine("</" + this.name + ">")
}
}
开始部分定义为构造函数,结束部分定义为 Dispose 方法。
然而,尽管这个结构很有吸引力,但有一个严重的警告,那就是 Dispose 方法是从 finally 块中调用的。所以有2个问题:
您应该避免从 finally 块中抛出异常,因为它们会覆盖应该被捕获的原始异常。
如果在“开始”和“结束”之间早些时候引发了异常,则无法知道 Dispose 方法的内部,因此无法相应地处理“结束”部分。
这两件事使使用此构造不切实际,这是一个非常可悲的事实。现在,我的问题是:
我对问题的理解正确吗?这就是“使用”的实际工作方式吗?
如果是这样,是否有任何方法可以克服这些问题并实际使用“使用”构造,而不是最初设计的用途(释放资源和清理)
如果没有实际的“使用”方式来使用这种方式。有哪些替代方法(在具有开头和结尾部分的某些代码上强制执行上下文)?