2016-08-22 62 views
-2

想了解StreamWriter源代碼的哪一部分是非託管代碼。已經通過http://referencesource.microsoft.com/網站的代碼。任何人都可以解釋爲什麼StreamWriter是非託管資源。

但它似乎是複雜的代碼來理解,源代碼中有很好的評論。但仍然有難以理解的地方,可能是我的知識不達標。但是,如果有人有任何博客或文章可以回答這個問題。這將會非常棒 !!!

+0

你是什麼意思「StreamWriter源代碼是非託管代碼」?你問爲什麼它是一次性的? – stuartd

+0

是@stuartd !!!。 – sameer

+1

僅僅因爲一個類型實現了'IDisposable'並不意味着**必須**使用非託管資源。 – user1620220

回答

2

StreamWriter不是一個unmanged資源,它是一個.NET類,它是100%管理的。

另一種完全不同的是,StreamWriter可能會在內部使用非託管資源,或擁有一個IDisposable對象,反過來可能使用的非託管資源,或僅僅簡單地擴展實現IDisposable類。

後兩個是爲什麼StreamWriter實現IDisposable的原因,但要注意,實施IDisposable一定意味着類使用直接或間接的非託管資源。

StreamWriter的特殊情況下,顯然它可能會間接消耗無法使用的資源;基礎流(IDisposable實例字段Stream stream)可能是FileStream,它顯然會消耗非託管資源(例如HD中的文件)。但是它也很有可能基礎流不使用任何非託管資源,但正如Colin Mackay在下面的評論中正確指出的那樣,所有流必須實現抽象類Stream提供的一致接口。

+0

謝謝,想了解什麼是那個強制實施IDisposable接口的Streamwriter使用。 – sameer

+1

@sameer兩個原因。首先,因爲它來源於'TextWriter',它實現了'IDisposable'。其次,因爲它在內部使用'Stream'字段,它是一個'IDisposable'對象(我給你的地方應該實現'Dispose()'的原因之一)。 – InBetween

+0

無論是否管理基礎流,它必須(如同流必須一樣)爲任何呼叫者提供一致的接口,否則您將違反Liskov替換原則。 –

0

StreamWriter是託管的,但是這是一個慣例,即釋放.NET Stream對象將始終處理任何基礎流。流通常被構造爲其他流的容器或包裝。例如,StreamWriter可能是FileStream的包裝(例如,當您使用System.IO.File.CreateText創建StreamWriter時)。由於FileStream使用受管資源,並且不一定有直接引用,所以能夠通過在StreamWriter上調用Dispose()來處置它很重要。

A FileStream包含OS級文件句柄形式的管理資源。

相關問題