我在StackOverflow
中搜索try-finally
和using
块,以及使用它们的最佳做法。
我在评论here中读到,如果您的申请因终止流程而突然终止,则finally
阻止
我想知道,这同样适用于using
块吗?例如,如果在Environment.exit()
块内发生using
调用,流会被关闭吗?:
//....
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();
甚至是前面提到的例子?
答案 0 :(得分:2)
它不应该在FileStream的特定情况下有所不同,当你使用它的BeginWrite()方法时,模块化一个棘手的角落情况。其终结器尝试完成写入其内部缓冲区中仍存在的任何未写入数据。然而,这通常不正确,如果您使用StreamWriter,将有所作为。
你要离开.NET Framework来决定你是否真的想要扯下地板并抓住写文件。或者它是否应该进行最后一次尝试来清除任何未写入的数据。 StreamWriter的结果往往是一个令人不愉快的结果,某些在尝试读取半写文件时会失败的非零赔率。
始终明确,如果您想确保不会发生这种情况,那么您需要确保正确调用Close()或Dispose()方法。或者删除文件。