使用 FileStream 写入文件而不使用“using”

本文关键字:using FileStream 文件 使用 | 更新日期: 2023-09-27 18:32:35

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

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

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

使用 FileStream 写入文件而不使用“using”

省略using .

请注意,在这种情况下,定义此方法的类应实现IDisposable并且应在其Dispose方法中释放流。 此类的用户应在 using 块中声明它。

首先,您显然需要删除using (_stream),因为这将直接处理流。

其次,StreamWriter 还将使用您当前的代码处理流。这方面的选项包括:

  • 对于StreamWriter也没有using语句,但如果需要立即将其写入文件,请显式刷新编写器:

    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);
        }
    }
    
  • 更改您的代码,以便类中的字段是要开始的TextWriter而不是Stream(初始化为您想要的任何文件/流的StreamWriter) - 然后您根本不需要在方法中创建新StreamWriter

正如 Servy 所指出的,你自己的类应该实现IDisposable并在其Dispose方法中释放流/编写器。

using用于

函数中的局部变量以隐式释放对象,但是当它是类的成员时,您应该在释放类时释放它。

class YourClass : IDisposable
{
    ....
    public void Dispose()
    {
       Dispose(true);
    }
    protected virtual void Dispose(bool disposing)
    {
      if (disposing)
      {
        _stream.Dispose();
      }
    }
}