使用FileStream写入文件而不使用"使用"

时间:2014-12-01 17:20:18

标签: c# events file-io filestream using

我有一个类成员变量_stream,它是FileStream。这个变量在构造函数中初始化,需要坚持到我完成这个类。我有另一个类,每次需要写入文件时都会引发一个事件。在我的主类中,我有一个执行实际写作的事件处理程序。我在this question中尝试了以下代码:

void MyEventHandler(string message)
{
    using (_stream)
        using (StreamWriter s = new StreamWriter(_stream))
           s.WriteLine(message);
}

但这不起作用,因为using在我完成之前处置了我的FileStream。我应该做什么呢?

3 个答案:

答案 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();
      }
    }
}