C# 使用FileStream写入文件,而不使用";使用;

C# 使用FileStream写入文件,而不使用";使用;,c#,events,file-io,filestream,using,C#,Events,File Io,Filestream,Using,我有一个类成员变量\u stream,它是文件流。这个变量在构造函数中被初始化,并且需要一直保留,直到我处理完这个类。我有另一个类,它在每次需要将某些内容写入文件时都会引发一个事件。在我的主类中,我有一个执行实际编写的事件处理程序。我在中尝试了以下代码: 但这不起作用,因为使用会在我完成文件流之前处理掉它。我应该怎么做呢?只需使用省略 注意,在这种情况下,定义此方法的类应该实现IDisposable,并且应该在其dispose方法中处理流。此类的用户应该在using块中声明它。首先,您显然需要使

我有一个类成员变量
\u stream
,它是
文件流
。这个变量在构造函数中被初始化,并且需要一直保留,直到我处理完这个类。我有另一个类,它在每次需要将某些内容写入文件时都会引发一个事件。在我的主类中,我有一个执行实际编写的事件处理程序。我在中尝试了以下代码:


但这不起作用,因为
使用
会在我完成
文件流之前处理掉它。我应该怎么做呢?

只需使用
省略


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

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

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

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

    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);
        }
    }
    
  • 更改代码,使类中的字段不是
    ,而是一个
    文本编写器
    (对于所需的任何文件/流,它初始化为
    StreamWriter
    ),然后根本不需要在方法中创建新的
    StreamWriter


正如Servy所指出的,您自己的类应该实现
IDisposable
,并在其
dispose
方法中处置流/写入程序。

使用
用于函数中的局部变量,以隐式处置对象,但当对象是类的成员时,您应该在处置该类时处置它

class YourClass : IDisposable
{
    ....
    public void Dispose()
    {
       Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
      if (disposing)
      {
        _stream.Dispose();
      }
    }
}

请注意,如果您使用(StreamWriter s…)
,则
StreamWriter
也将尝试处理流。。。我们需要小心地混合编写器和原始流-至少在完成编写时是
.Flush()
writer。流从何而来?实际的错误/症状是什么?这个问题不清楚,也不完整。
class YourClass : IDisposable
{
    ....
    public void Dispose()
    {
       Dispose(true);
    }

    protected virtual void Dispose(bool disposing)
    {
      if (disposing)
      {
        _stream.Dispose();
      }
    }
}