2014-12-01 82 views
0

我有一個類成員變量_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

回答

4

首先,您顯然需要刪除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方法的流/寫器的處理。

6

只是省略了using

請注意,在這種情況下,定義此方法的類應該實現IDisposable,它應該在其方法Dispose中處理該流。這個類的用戶應該在using塊中聲明它。

+0

請注意,如果您使用(StreamWriter s ...)''StreamWriter'也會嘗試處理流... ...當您需要小心混合編寫器和原始流時 - 至少在.Flush()'作家完成。 – 2014-12-01 17:26:19

2

using用於隱式地處理對象的函數中的局部變量,但是當它是類的成員時,應該在處理類時處理它。

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

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