「C# 4.0 in a Nutshell」(O'Reilly) を読み終えたところですが、C# に切り替えようとしているプログラマーにとっては素晴らしい本だと思いますが、疑問が残りました。using
私の問題は、ステートメントの定義です。本(p.138)によると、
using (StreamReader reader = File.OpenText("file.txt")) {
...
}
以下と正確に同等です:
StreamReader reader = File.OpenText("file.txt");
try {
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
ただし、これが正しく、このコードが別のスレッドで実行されるとします。このスレッドは現在 で中止されてthread.Abort()
いるため、 aThreadAbortException
がスローされ、スレッドがリーダーを初期化した直後でtry..finally
句に入る前にあるとします。これは、リーダーが処分されていないことを意味します。
考えられる解決策は、次のようにコーディングすることです。
StreamReader reader = null;
try {
reader = File.OpenText("file.txt");
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
これはアボートセーフです。
今私の質問のために:
- 本の著者は正しく、
using
ステートメントはアボートセーフではありませんか、それとも間違っていて、私の2番目のソリューションのように動作しますか? - が最初のバリアント (アボートセーフではない) と同等である場合
using
、なぜチェックインするnull
のfinally
ですか? - 本 (p. 856) によると、
ThreadAbortException
マネージド コードのどこにでもスローできます。しかし、おそらく例外があり、最初の亜種はアボートセーフなのでしょうか?
編集:thread.Abort()
使用は良い習慣とは見なされないことを知っています。using
私の関心は純粋に理論的なものです。ステートメントは正確にどのように動作するのでしょうか?