C# 3.0 关闭FileStream和将其设置为null有什么区别?

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)) {

我有以下代码来读写一行文字文件。我们可以在处理结束时将null分配给reader和writer对象吗?还是应该调用Close()方法?多谢各位

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()已经关闭了读卡器流和底层文件流。我不能为读写器创建不同的流,因为我必须锁定文件,直到它完成对文件的写入。在这种情况下,你知道怎么做吗?非常感谢。