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

问题描述:

我有一个类成员变量_stream这是一个FileStream。这个变量在构造函数中被初始化,并且需要坚持到我完成这个类为止。每当需要将文件写入文件时,我都会有另一个类引发事件。在我的主类中,我有一个执行实际写作的事件处理程序。我试着下面的代码作为this question使用FileStream写入文件而不使用“使用”

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

但是,这并不工作,因为using处置的我FileStream之前,我是受够了。我应该做些什么呢?

+0

只是不使用它。 – Ahmad 2014-12-01 17:22:01

+0

_stream从哪里来?什么是实际的错误/症状?这个问题不明确,不完整。 – 2014-12-01 17:31:18

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

由于Servy笔记,自己的类应该实现IDisposable并在其Dispose方法的流/写器的处理。

只是省略了using

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

+0

请注意,如果您使用(StreamWriter s ...)''StreamWriter'也会尝试处理流... ...当您需要小心混合编写器和原始流时 - 至少在.Flush()'作家完成。 – 2014-12-01 17:26:19

using用于隐式地处理对象的函数中的局部变量,但是当它是类的成员时,应该在处理类时处理它。

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

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