C# 3.0 关闭FileStream和将其设置为null有什么区别?
我有以下代码来读写一行文字文件。我们可以在处理结束时将null分配给reader和writer对象吗?还是应该调用Close()方法?多谢各位C# 3.0 关闭FileStream和将其设置为null有什么区别?,c#-3.0,C# 3.0,我有以下代码来读写一行文字文件。我们可以在处理结束时将null分配给reader和writer对象吗?还是应该调用Close()方法?多谢各位 FileInfo JFile = new FileInfo(@"C:\test.txt"); using (FileStream JStream = JFile.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)) {
FileInfo JFile = new FileInfo(@"C:\test.txt");
using (FileStream JStream = JFile.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
StreamReader reader = null;
StreamWriter writer = null;
try
{
int n;
reader = new StreamReader(JStream);
string line = reader.ReadLine();
int.TryParse(line, out n);
n = n + 1;
writer = new StreamWriter(JStream);
JStream.Seek(0, SeekOrigin.Begin);
writer.WriteLine(n);
writer.Flush();
}
catch (Exception x)
{
string message = string.Format("Error while processing the file. {0}", x.Message);
System.Windows.Forms.MessageBox.Show(message);
}
reader = null;
writer = null;
}
您应该调用Close方法,以便释放所有底层非托管资源。将对象设置为null不会释放资源。详情请参阅
更新:由于您的代码在using语句中,一旦using语句中的执行完成,将自动调用Dispose方法。关闭文件时需要执行某些操作。例如,当您的程序访问一个文件并在其上创建
.Close()
-通过调用流,框架可以立即释放句柄和其他类似资源
当您将其设置为null
时,您依赖于垃圾收集器为您完成这项重要功能。GC现在可能会把它全部清理干净,也可能不会。你不知道什么时候会发生。如果您的程序崩溃,它可能永远不会释放句柄
.Close()
流总是一个好主意。StreamReader
和StreamWriter
都实现了IDisposable
,这是他们的说法
“当你对我了结后,请调用此方法(Dispose()
),这样我就知道你对我了结了,我可以清理自己了。”
(这也称为确定性终结)
因此,您需要对它们调用
Dispose
,或者使用语句将它们包装在中,这对您来说也是一样的。对于这两个类,Dispose
将在内部调用Close
,如果它尚未关闭。您实际上希望调用Close()或更好的Dispose(),以确保刷新所有内容。如果未显式关闭/处置写入程序,则可能无法写入缓冲区。将对象设置为null时,会告诉CLR您不再需要它,并且它已计划进行垃圾收集。您将遇到的问题是,直到程序结束并关闭CLR后,才会释放您打开的文件中的CLR挂钩。当您调用Close()方法时,文件资源将被清理,然后所有的位和块都被正确地安排为垃圾收集
如果您在using块中打开streamreader,它也会为您解决这个问题,但是您会失去一些通过try/catch/finally块得到的细粒度错误处理。我认为最好的解决方案是使用语句(就像您在FileStream
中所做的那样)。
它将负责所有的清洁工作。对所发生的一切进行了很好的解释。谢谢大家的解释。我使用相同的FileStream对象创建StreamReader和StreamWriter。如果我在reader和writer对象上调用Close()方法,当到达writer.Close()时,会收到一条错误消息“无法访问已关闭的文件”。我猜是因为reader.Close()已经关闭了读卡器流和底层文件流。我不能为读写器创建不同的流,因为我必须锁定文件,直到它完成对文件的写入。在这种情况下,你知道怎么做吗?非常感谢。