關閉或處理
回答
該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);
}
}
}
關閉調用配置(true),將使用block也調用配置(true)? – user496949 2010-11-11 11:02:50
是的,它會... – 2010-11-11 11:50:17
這就解釋了爲什麼如果你在調用'Close()'的''''''內部的代碼時運行Visual Studio的代碼分析,你將得到'CA2202 \t不要多次處理對象' - 因爲'Close()'已經放棄了,'使用'最終會再次嘗試處理這個對象。我想知道,那麼......爲什麼我們不真正面對'System.ObjectDisposedException'。 – Veverke 2016-07-07 14:47:41
使用塊是所有你需要的。
使用將保證調用處理。與致電關閉是否一樣? – user496949 2010-11-11 10:51:01
處置會隱式關閉流 – 2010-11-11 10:52:16
配置是足夠的,並且是必不可少的,因爲它會自動調用Close並執行更多關閉不會執行的操作。
使用塊是優雅的方式來處理所以是的,只要有可能就使用它。
是不是相反,即。關閉會調用處理? – 2014-02-26 12:48:22
@Backwards_Dave不,這將是一個對象自己處置的嚴重錯誤。關閉它後,您可能仍想使用該實例。 – 2014-02-26 14:22:11
在TextReader類(StreamReader的父類)中,Close()和Dispose()方法的實現是相同的,並調用Dispose(true)。在StreamReader類中,'Close()'調用置換對象的重寫的'Dispose(true)'。因此,在這種情況下,說'Close'調用'Dispose'是正確的。 – 2014-10-24 14:34:32
如果您想了解using
的更多信息,請點擊這裏看看
報價從網站:
using語句允許 程序員指定對象時 那些使用資源應該釋放 他們。提供給使用 語句的對象必須實現 IDisposable接口。此接口 提供Dispose方法,其中 應釋放對象的資源。
似乎有一些關於Dispose
實際上是否正常工作。
本質 - 你可以相當肯定的是,BCL(基類庫)中的任何一個實現IDisposable
會妥善整理自己打扮時調用Dispose - 當using語句超出範圍等。
如果在未關閉的流中出現問題,他們現在已經被選中 - 您可以信任IDisposable
。這是當你使用其他庫時,你依賴於Dispose
實現。
使用通過使用塊進行處理以確保清理髮生。
如果在使用塊結束之前完成對象的使用,請儘可能快地釋放所有資源。
因此,兩者將會攜手合作,但如果您要在幾個納秒內達到塊的末端,後者可能是多餘的。
我們都知道System.IO.StreamReader
不是唯一一個實現了IDisposable
和Close()
方法的.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
,是約定的結果,而不是要求。
有人發表了評論
,與Dispose模式實現IDisposable
另一個類的一個實例,並且具有Close()
方法。在這種情況下,Close()
是否與Dispose()
運行相同的代碼?我沒有看過源代碼,但我不會說。
- 1. 處理JPopupMenu關閉
- 2. 處理JFileChooser窗口關閉?
- 3. 關閉後處理表格
- 4. 在WindowsME上處理用戶註銷或機器關閉請求
- 5. 如何在JavaScript或Jquery中處理瀏覽器關閉(交叉)
- 6. 我該如何處理「IllegalStateException:BeanFactory未初始化或已經關閉」?
- 7. 如何在ASP.NET中處理或關閉XML文檔的實例
- 8. 當用戶關閉或保存文件後處理Diagnostics.Process.Start vb.net/c#
- 9. SQL Server關閉或處理反斜槓刪除換行
- 10. 當我關閉PYQT MainFrame時,如何關閉多處理器
- 11. android:如何處理強制關閉
- 12. jQuery:燈箱關閉事件處理
- 13. 處理髮送對象關閉事件
- 14. 的WebSocket關閉錯誤處理
- 15. Keytool批處理文件自動關閉
- 16. C#列表<Stream>處理/關閉
- 17. 多處理線程池關閉,超時
- 18. 我想處理關閉xfce4-notifyd通知
- 19. 在JavaScript中關閉處理瀏覽器?
- 20. 如何關閉異常處理?
- 21. SDL_PeepEvents不會處理窗口關閉
- 22. 多處理中的關閉程序
- 23. 沒有關閉批處理程序
- 24. 關閉龍捲風處理程序
- 25. Win32/C++的關閉異常處理
- 26. Memcache服務已關閉 - 如何處理?
- 27. 新的FileStream已經關閉/處理?
- 28. 如何處理客戶端關閉Javascript?
- 29. MassTransit如何處理RabbitMQ關閉
- 30. 爲OpenOffice.org處理「保存/關閉事件」
http://stackoverflow.com/q/61092/102112 – Alex 2011-03-05 12:25:01