Я только что закончил читать "C # 4.0 in a Nutshell" (О'Рейли), и я думаю, что это отличная книга для программиста, желающего перейти на C #, но она осталась мне интересно. Моя проблема - это определение с использованием оператора
. Согласно книге (стр. 138),
using (StreamReader reader = File.OpenText("file.txt")) {
...
}
в точности эквивалентно:
StreamReader reader = File.OpenText("file.txt");
try {
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
Предположим, однако, что это правда и что этот код выполняется в отдельном потоке. Этот поток теперь прерывается с помощью thread.Abort ()
, поэтому возникает исключение ThreadAbortException
, и предположим, что поток находится точно после инициализации считывателя и до входа в попытку ... наконец
пункт. Это означало бы, что читатель не настроен!
Возможным решением было бы закодировать следующим образом:
StreamReader reader = null;
try {
reader = File.OpenText("file.txt");
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
Это было бы безопасным для прерывания.
Теперь к моим вопросам:
using
не является безопасным для прерывания или они неверны и ведут себя так же, как и в моем втором решении? using
эквивалентно первому варианту (не безопасному для прерывания ), почему он проверяет null
в , наконец,
? ThreadAbortException
может возникать в любом месте управляемого кода. Но, может быть, есть исключения, и первый вариант в конце концов безопасен для прерывания? РЕДАКТИРОВАТЬ: Я знаю, что использование thread.Abort ()
не считается хорошей практикой. Мой интерес носит чисто теоретический характер: как оператор using
ведет себя точно ?