2010-11-11 261 views
22

StreamReader類具有close和dispose方法。我想知道調用哪個方法來清理所有資源。關閉或處理

如果使用使用塊,我認爲它會調用它的dispose方法。清理所有資源是否足夠?

+1

http://stackoverflow.com/q/61092/102112 – Alex 2011-03-05 12:25:01

回答

22

using塊將在StreamReader實例上調用Dispose()。一般來說,如果一個類型是IDisposable,您應該將它放在using範圍內。

編輯: 如果你看一下Close()實施StreamReader使用反射,你會看到,它調用Dispose(true)。因此,如果您未使用using示波器,則在此特定情況下,手動調用Close()將與調用Dispose()相同。

protected override void Dispose(bool disposing) 
{ 
    try 
    { 
     if ((this.Closable && disposing) && (this.stream != null)) 
     { 
      this.stream.Close(); 
     } 
    } 
    finally 
    { 
     if (this.Closable && (this.stream != null)) 
     { 
      this.stream = null; 
      this.encoding = null; 
      this.decoder = null; 
      this.byteBuffer = null; 
      this.charBuffer = null; 
      this.charPos = 0; 
      this.charLen = 0; 
      base.Dispose(disposing); 
     } 
    } 
} 
+0

關閉調用配置(true),將使用block也調用配置(true)? – user496949 2010-11-11 11:02:50

+0

是的,它會... – 2010-11-11 11:50:17

+0

這就解釋了爲什麼如果你在調用'Close()'的''''''內部的代碼時運行Visual Studio的代碼分析,你將得到'CA2202 \t不要多次處理對象' - 因爲'Close()'已經放棄了,'使用'最終會再次嘗試處理這個對象。我想知道,那麼......爲什麼我們不真正面對'System.ObjectDisposedException'。 – Veverke 2016-07-07 14:47:41

1

使用塊是所有你需要的。

+0

使用將保證調用處理。與致電關閉是否一樣? – user496949 2010-11-11 10:51:01

+0

處置會隱式關閉流 – 2010-11-11 10:52:16

16

配置是足夠的,並且是必不可少的,因爲它會自動調用Close並執行更多關閉不會執行的操作。

使用塊是優雅的方式來處理所以是的,只要有可能就使用它。

+0

是不是相反,即。關閉會調用處理? – 2014-02-26 12:48:22

+0

@Backwards_Dave不,這將是一個對象自己處置的嚴重錯誤。關閉它後,您可能仍想使用該實例。 – 2014-02-26 14:22:11

+3

在TextReader類(StreamReader的父類)中,Close()和Dispose()方法的實現是相同的,並調用Dispose(true)。在StreamReader類中,'Close()'調用置換對象的重寫的'Dispose(true)'。因此,在這種情況下,說'Close'調用'Dispose'是正確的。 – 2014-10-24 14:34:32

0

如果您想了解using的更多信息,請點擊這裏看看

Using

報價從網站:

using語句允許 程序員指定對象時 那些使用資源應該釋放 他們。提供給使用 語句的對象必須實現 IDisposable接口。此接口 提供Dispose方法,其中 應釋放對象的資源。

0

似乎有一些關於Dispose實際上是否正常工作。

本質 - 你可以相當肯定的是,BCL(基類庫)中的任何一個實現IDisposable會妥善整理自己打扮時調用Dispose - 當using語句超出範圍等。

如果在未關閉的流中出現問題,他們現在已經被選中 - 您可以信任IDisposable。這是當你使用其他庫時,你依賴於Dispose實現。

1

使用通過使用塊進行處理以確保清理髮生。

如果在使用塊結束之前完成對象的使用,請儘可能快地釋放所有資源。

因此,兩者將會攜手合作,但如果您要在幾個納秒內達到塊的末端,後者可能是多餘的。

3

我們都知道System.IO.StreamReader不是唯一一個實現了IDisposableClose()方法的.NET 4.0+類。對於此問題中StreamReader的情況,源代碼顯示基類TextReader.Close(),TextReader.Dispose()都運行相同的代碼行。您還可以在代碼中看到TextReader.Dispose()是您撥打StreamReader.Dispose()時的實施方式(因爲StreamReader未覆蓋Dispose的方法超載簽名)。

所以要StreamReader.Dispose()通話將運行this inherited line of code,它調用保護覆蓋方法StreamReader.Dispose(disposing: true),因此將StreamReader.Close()呼叫StreamReader.Dispose(disposing: true)。因此,對於StreamReader,Close()Dispose()的情況確實會運行相同的代碼行。

關於Close()或Dispose()問題的更一般的,非特定於類的答案?,可能要注意微軟已經相當清楚了documentation on implementing IDisposable and the Dispose pattern。快速閱讀足以向您展示實施Close()方法不是Dispose模式的要求。

imho找到方法Close()的原因在這麼多類實現IDisposable,是約定的結果,而不是要求。

有人發表了評論

Close and Dispose - which to call?

,與Dispose模式實現IDisposable另一個類的一個實例,並且具有Close()方法。在這種情況下,Close()是否與Dispose()運行相同的代碼?我沒有看過源代碼,但我不會說。