我有一个类成员变量_stream
,它是FileStream
。这个变量在构造函数中初始化,需要坚持到我完成这个类。我有另一个类,每次需要写入文件时都会引发一个事件。在我的主类中,我有一个执行实际写作的事件处理程序。我在this question中尝试了以下代码:
void MyEventHandler(string message)
{
using (_stream)
using (StreamWriter s = new StreamWriter(_stream))
s.WriteLine(message);
}
但这不起作用,因为using
在我完成之前处置了我的FileStream
。我应该做什么呢?
答案 0 :(得分:6)
只需省略using
。
请注意,在这种情况下,定义此方法的类应实现IDisposable
,并且应该在其Dispose
方法中处理该流。此类的用户应在using
块中声明它。
答案 1 :(得分:4)
首先,您显然需要删除using (_stream)
,因为它会直接处理流。
其次,StreamWriter
也也会使用您当前的代码处理流。选项包括:
也没有using
的{{1}}语句,但如果您需要立即将其写入文件,请显式刷新编写器:
StreamWriter
使用void MyEventHandler(string message)
{
var s = new StreamWriter(_stream);
s.WriteLine(message);
s.Flush();
}
的构造函数,它允许您控制在StreamWriter
处置时是否关闭流:
StreamWriter
更改代码,以便代替void MyEventHandler(string message)
{
using (var s = new StreamWriter(_stream, Encoding.UTF8, 1024, true))
{
s.WriteLine(message);
}
}
,而不是Stream
,您的类中的字段是TextWriter
开头的(对于任何文件/它都被初始化为StreamWriter
您想要的流) - 然后您根本不需要在方法中创建新的StreamWriter
。
正如Servy所说,你自己的班级应该实现IDisposable
并在其Dispose
方法中处理流/作者。
答案 2 :(得分:2)
using
用于函数中的局部变量来隐式处理对象,但是当它是类的成员时,你应该在处理类时处理它。
class YourClass : IDisposable
{
....
public void Dispose()
{
Dispose(true);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_stream.Dispose();
}
}
}