2016-10-07 55 views
0

它從我開始讀一stackoverflow answer爲什麼我需要在stringreader和stringwriter上調用dispose?

StringWriter implments上MSDNpublic abstract class TextWriter : MarshalByRefObject, IDisposable

它說:

該框架提供了應 實施提供開發人員手動System.IDisposable接口一旦不需要,可以立即釋放非託管 資源。

但是什麼被視爲非託管資源?我顯然不認爲StringWriter符合資格。如果我寫我自己沒有繼承IDisposable的....我看不出有任何需要補充Dispose()

class ConfusedDevStringWriter{ 
    private StringBuilder sb; 
    public ConfusedDevStringWriter(){ //ctor 
     sb = new StringBuilder(); 
    } 
} 

事實上我與Visual Studio調試器的內存測試: enter image description here 一次函數返回時,StringWriterStringBuilder被釋放...... Moreoever,調用Dispose似乎爲StringWriter的什麼也不做......

enter image description here

所以不是每一個說和poorly類從IDisposable rit有用Dispose。這又回到我的問題什麼被視爲非託管資源(例子將非常感謝n_n)。我聽說文件是其中的一個......但不是CLR的虛擬機?......每個資源都應該由它來管理,不是?從抽象TextWriter,它實現IDisposable,並具有一定的子類有像流,文件句柄等,所以可以安全地處理TextWriter任何子類的非託管資源,而無需擔心

+3

你的問題「*什麼被視爲非託管資源*」已經有了答案:http://stackoverflow.com/questions/3433197/what-exactly-are-unmanaged-resources – user3185569

+1

問題在標題中回答或多或少HTTP ://Stackoverflow.com/questions/234059/is-a-memory-leak-created-if-a-memorystream-in-net-is-not-closed(關於MemoryStream的Q也一樣)。 –

+0

我把它作爲http://stackoverflow.com/questions/2475228的一個副本關閉,它和http://stackoverflow.com/questions/3433197可以解答這兩個問題。 –

回答

0

StringWriter繼承如果處置是必要的或不。

所以設置一StringWriter可能實際上沒有任何(類似DataSet),但它仍然是處置任何實現IDisposable很好的做法。

+1

我不同意。調用不執行任何操作的代碼並不是一個好習慣。這實際上是不好的做法。編程語言有助於「處理」;不等或者什麼都不做。 – Darkonekt

1

StringWriterTextWriter下降,它實現IDisposable,可能是因爲TextWriters將有非託管資源。如果您收到TextWriter並且您不知道它來自哪裏(即它可能是TextWriter的任何後裔),那麼TextWriter實施IDisposable的事實允許您正確管理它擁有的任何非託管資源。您可以編寫接受任何TextWriter的代碼,在不再需要作者時調用Dispose,並相信所有內容都會清理乾淨。

相關問題