2011-08-01 75 views
2

我不知道如何檢查它,例如:在流中環繞流 - 將包裝的流妥善處理?

using (var stream = new StreamWriter(someStream)) 
{ 
    stream.Write(""); 
} 

將在這樣的表現:

using (var stream1 = someStream) 
{ 
    using (var stream2 = new StreamWriter(stream1)) 
     stream.Write(""); 
} 

,或者如果我包裝成GZipStream或任何其他流...第一個例子是否會處理每個下層流?

更新:

最後,它打我 - 只是實現Stream類自己:

class MyStream : Stream 
{ 
    // fake stream implementation 

    protected override void Dispose(bool disposing) 
    { 
     Console.WriteLine("disposing in my class"); 
     base.Dispose(disposing); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyStream stream = new MyStream(); 
     DoSomething(stream); 
     stream.Dispose(); 

     Console.WriteLine("end of program"); 
    } 

    private static void DoSomething(Stream stream) 
    { 
     using (var writer = new StreamWriter(stream)) 
     { 
      Console.WriteLine("inside using statement"); 
     } 

     Console.WriteLine("after writing"); 
    } 
} 

和結果:

inside using statement 
disposing in my class 
after writing 
disposing in my class 
end of program 

回答

2

調用close的最頂部的流瀑布關閉它們,但是這不是建議的,因爲很難保持標籤打開和不打開。正如另一個回答者所說的那樣,虔誠地使用使用塊。

希望這會有所幫助!

2

不,你不能依賴它爲任何IDisposable對象設置基礎流(雖然在StreamWriter的情況下它被記錄爲這樣)。一般不要靠它。

您應該使用嵌套使用語句。

+0

downvoter ....爲什麼?我說的是正確的,你不應該*依賴*實現IDisposable調用的對象在任何成員/參數IDisposable對象上的Dispose。 –

+0

這好像是說你不能依賴包裝類不會崩潰 - 使用一個我不能依賴的框架的關鍵點是什麼? – argh

+0

在他的例子中使用的類很好,但是如果OP採取這種表示,對於IDisposable對象的所有組合都可以,這會出現問題。 –

2

您在這裏混合了兩個概念。

主要是使用塊嵌套,並在第二個示例中正確使用它們。

第二個問題是嵌套/包裝/鏈接一次性類。在StreamWriter和Stream的情況下,Writer將關閉流。但是你不想知道這一點,只是使用使用模式。

一個小提示,下面的替代佈局更易於閱讀和維護。添加GZipStream時,你將有3個以上的嵌套塊。

using (var stream1 = File.Create(...)) 
using (var stream2 = new StreamWriter(stream1)) 
{  
     stream2.Write(""); 
} 
+0

一般來說,我同意這一點,你應該避免「知識依賴」,但在這種情況下,它也被記錄爲發生,所以不處理內部流對象是完全安全的。 –

+0

@Lasse正確,但我傾向於避免它。除了相關的情況,比如在Writer之後使用流。 –

+0

我完全同意你的觀點,即使我「知道」在這種特殊情況下無關緊要,我仍然會這樣做。我從來沒有想過我,也沒有一位開發人員在我的代碼中出現,並認爲「這很奇怪」,僅僅是因爲我覺得「優化」了這行代碼。 –