我刚刚读完“C# 4.0 in a Nutshell”(O'Reilly),我认为这对于愿意切换到 C# 的程序员来说是一本很棒的书,但它让我感到疑惑。我的问题是using
声明的定义。根据这本书(第 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
抛出 a 并假设线程恰好在初始化读取器之后和进入try..finally
子句之前。这意味着读者没有被处置!
一个可能的解决方案是这样编码:
StreamReader reader = null;
try {
reader = File.OpenText("file.txt");
...
} finally {
if (reader != null)
((IDisposable)reader).Dispose();
}
这将是中止安全的。
现在我的问题:
- 这本书的作者是对的,并且该
using
声明不是安全中止的,还是他们错了,它的行为就像我的第二个解决方案一样? - 如果
using
等效于第一个变体(不是中止安全的),为什么要检查null
infinally
? - 根据本书 (p. 856),
ThreadAbortException
可以在托管代码中的任何地方抛出。但也许有例外,第一个变体毕竟是中止安全的?
编辑:我知道使用thread.Abort()
不被认为是好的做法。我的兴趣纯粹是理论上的:该using
语句的行为如何?