「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メソッドの内部で、「beginning」と「end」の間に例外が以前にスローされたかどうかを知る方法はありません。したがって、「end」部分をそれに応じて処理する方法はありません。
これらの2つのことにより、この構成を使用することは実用的ではありません。これは非常に悲しい事実です。さて、私の質問は次のとおりです。
問題についての私の理解は正しいですか?これは実際に「使用」がどのように機能するのですか?
もしそうなら、これらの問題を克服し、本来の目的以外の「使用」構造を実用化する方法はありますか(リソースの解放とクリーンアップ)
このように「使用する」ための実用的な方法がない場合。代替アプローチは何ですか(最初と最後の部分でいくつかのコードにコンテキストを適用するため)?