如何关闭StreamReader/StreamWriter流对象作为类成员?
问题描述:
如果我有一个文件流的成员,像这样一类:如何关闭StreamReader/StreamWriter流对象作为类成员?
public class FooBar
{
private StreamReader reader;
private StreamWriter writer;
public FooBar(string readerFilePath, string writerFilePath)
{
reader = new StreamReader(readerFilePath);
writer = new StreamWriter(writerFilePath);
}
...
}
那我怎么关闭这些流?
看来,他们是在课程销毁期间默认关闭的,但是我不得不使用writer.Flush()
这听起来不太好。
答
使用使用块
using(reader = new StreamReader(readerFilePath))
{
//your code
}
从下面的链接: 提供了一个方便的语法,以确保正确使用IDisposable的对象。
从MSDN:
C#,通过.NET Framework公共语言运行库(CLR), 自动释放用于存储没有 不再需要的对象的存储器。记忆的释放是非确定性的;内存是 每当CLR决定执行垃圾回收。 但是,通常最好尽快释放有限的资源,例如文件 句柄和网络连接。
using语句允许程序员指定 使用资源的对象应何时释放它们。提供给使用 语句的对象必须实现IDisposable接口。此接口 提供了Dispose方法,该方法应释放对象的 资源。换句话说,using语句告诉.NET在不再需要使用块中指定的对象时释放 。
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement
FooBar的应该实现IDisposable。请参阅[正确实施IDisposable](https://msdn.microsoft.com/en-us/library/ms244737.aspx?f=255&MSPPError=-2147217396)和[正确实施IDisposable](https://stackoverflow.com/a/18337005/2066142) – KiwiPiet
如果我必须显式调用Dispose()方法,仍然不会在IDisposable接口背后得到原因。在我的特殊情况下,我不能使用'using'关键字。如果我试图在析构函数中调用'writer.Close()'(我会用C++的方式),我得到一个异常,告诉流已经关闭。 –
也许我必须了解垃圾收集器如何工作... –