我在StackOverflow
中搜索有关try-finally
和using
块以及使用它们的最佳实践。我在这里的评论中读到,如果您的应用程序通过终止进程而突然终止,则不会执行finally
块。
我想知道,这同样适用于using
块吗?例如,如果在using
块内发生Environment.exit()
调用,流是否会关闭?
//....
using (FileStream fsSource1 = new FileStream(pathSource,
FileMode.Open, FileAccess.Read))
{
//Use the stream here
Environment.exit();
}
再想一想,并且知道如果在程序调用中未正确关闭CLR
垃圾收集器可能会处理流对象,如果程序在完成流使用后确定终止,是否认为有必要在代码中关闭流?
例如,以下两者之间是否有任何实际区别:
//....
using (FileStream fsSource1 = new FileStream(pathSource,
FileMode.Open, FileAccess.Read))
{
//Use the stream here
}
Environment.exit();
和:
//....
FileStream fsSource1 = new FileStream(pathSource, FileMode.Open, FileAccess.Read);
//Use the stream here
Environment.exit();
甚至是前面提到的例子?
在FileStream的特定情况下,它不应该有所不同,当你使用它的BeginWrite()方法时,这是一个棘手的极端情况。 它的终结器尝试完成写入其内部缓冲区中仍然存在的任何未写入数据。 然而,这通常不是真的,例如,如果您使用StreamWriter,它将有所不同。
你留给 .NET Framework 来决定的是你是否真的想猛拉地板垫并抓住编写文件。 或者它是否应该做最后的尝试来冲洗任何未写入的数据。 在StreamWriter的情况下,结果往往是一个令人不快的结果,当它试图读取一个半写的文件时,某些东西会倒下的几率不为零。
始终明确,如果您想确保不会发生这种情况,那么由您来确保您正确调用了 Close() 或 Dispose() 方法。 或者删除该文件。