2017-08-04 27 views
-1

如果我有一个文件流的成员,像这样一类:如何关闭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()这听起来不太好。

+2

FooBar的应该实现IDisposable。请参阅[正确实施IDisposable](https://msdn.microsoft.com/en-us/library/ms244737.aspx?f=255&MSPPError=-2147217396)和[正确实施IDisposable](https://stackoverflow.com/a/18337005/2066142) – KiwiPiet

+0

如果我必须显式调用Dispose()方法,仍然不会在IDisposable接口背后得到原因。在我的特殊情况下,我不能使用'using'关键字。如果我试图在析构函数中调用'writer.Close()'(我会用C++的方式),我得到一个异常,告诉流已经关闭。 –

+0

也许我必须了解垃圾收集器如何工作... –

回答

0

使用使用块

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

What is the C# Using block and why should I use it?