2016-08-22 8 views
-2

StreamWriterソースコードのどの部分がアンマネージドコードであるかを理解したいですか。コードhttp://referencesource.microsoft.com/のウェブサイトに行ってきました。StreamWriterが管理されていないリソースである理由を説明できます。

しかし、それはソースコードには良いコメントがあることを理解するのは複雑なコードのようです。しかし、まだ理解するのは難しい時間があったかもしれませんが、私の知識はそのマークまでではないかもしれません。しかし、誰かがこの質問に答えることができるブログや記事を持っている場合。それは素晴らしいだろう!

+0

「StreamWriterソースコードは管理されていないコード」とはどういう意味ですか?なぜそれが使い捨てであるのか尋ねていますか? – stuartd

+0

はい@stuartd !!! – sameer

+1

型が 'IDisposable'を実装しているからといって、**管理対象外のリソースを使用しなければならない**という意味ではありません。 – user1620220

答えて

2

StreamWriterは、アンマネージリソースでもなく、.NETクラスでもあり、100%管理されています。

もう全く違う事がStreamWriterが内部でアンマネージリソースを使用するか、順番に管理されていないリソースを使用する、または単にIDisposableを実装するクラスを拡張するかもしれないIDisposableオブジェクトを所有するかもしれないということです。

後者の二つはIDisposableは必ずしもクラスは、直接的または間接的に、アンマネージリソースを使用していることを意味するものではありません実装し、StreamWriterIDisposable実装した理由ですが、注意してください。

StreamWriterの特定のケースでは、間違いなく無人リソースを消費する可能性があることは明らかです。 (IDisposableインスタンスフィールドStream streamFileStreamは、管理されていないリソース(たとえば、HDのファイル)を消費する可能性があります。しかし、基本的なストリームが管理されていないリソースを使用していない可能性も非常に高いですが、Colin Mackayは下の解説で正しく指摘していますので、すべてのストリームは抽象クラスStreamが提供する一貫したインターフェイスを実装する必要があります。

+0

ありがとう、IDisposableインターフェイスの実装を強制するそのストリームライターの使用は何かを理解したい。 – sameer

+1

@サムーヤー2つの理由。まず第一に、 'IDisposable'を実装する' TextWriter'から派生しているからです。第二に、内部的に 'IDisposable'オブジェクトである' Stream'フィールドを使用しているからです(あなたが 'Dispose()'を実装すべき場所の一つです)。 – InBetween

+0

基本的なストリームが管理されているかどうかにかかわらず、ストリーム自体である必要があるため、呼び出し元のために一貫したインターフェイスを維持する必要があります。そうしないと、Liskov置換原則が破られます。 –

0

StreamWriterが管理されていますが、.NET Streamオブジェクトを削除すると、常に基になるストリームが破棄されます。ストリームは、多くの場合、他のストリームを囲むコンテナまたはラッパーとして構築されます。たとえば、StreamWriterは、のラッパーでもかまいません(たとえば、StreamWriterSystem.IO.File.CreateTextで作成した場合)。 FileStreamは管理リソースを使用するため、必ずしも直接参照する必要はありませんので、StreamWriterのDispose()を呼び出すことで廃棄することが重要です。

FileStreamには、管理対象リソースがOSレベルのファイルハンドルの形式で格納されています。

関連する問題