28

注:次の2つの質問をすでに読みました。

ストリームの概念を説明できますか?

ストリームを使用したC#

私はC#でコーディングしています

  1. ストリームを使用するほとんどすべてのコードサンプルでは、​​ほとんどの場合、.Dispose()、. Flush()、. Close()が呼び出されます。
    • ストリームの概念では、何が達成されますか?
    • 変数に保存したストリームを破棄しない場合、アプリケーションがどこかにリークしていますか?
    • これらの関数のいずれかを呼び出す必要があるのはなぜですか?私はこれを行わず、それでも(明らかな破損なしに)仕事を成し遂げるコードサンプルを見てきました

私は現在、アプリケーションでクラスを構築しています。このクラスには、GetStream()を介してストリームを返すプライマリメソッド(それを呼び出すことができます)が含まれています。myWebRequest.GetResponse().GetResponseStream()

プライマリメソッドは、ストリームを必要とするすべての操作(StreamReader、Bitmap()など)に使用できるオブジェクトをGetStream()返します。Stream

.GetStream()ストリームを最後に使用した後(ガベージコレクション)に、呼び出し元に手動で破棄するように強制することなく、ストリームを自動的に破棄する方法はありますか?

おそらくお分かりのように、私の質問は曖昧で一般的です。ストリームについての私の理解はしっかりしていないので、SOの質問が提供できるよりもストリームをより深く見ることができる役立つ記事へのリンクをいただければ幸いです。

4

1 に答える 1

38

ストリームを破棄すると、ストリームが閉じられます(おそらく、他のことはほとんど行われません)。ストリームを閉じると、ストリームがフラッシュされ、ファイルハンドルなど、ストリームに関連するすべてのリソースが解放されます。ストリームをフラッシュすると、まだ書き込まれていないバッファリングされたデータが取得され、すぐに書き出されます。一部のストリームは、ディスクファイルやネットワークパイプなどの比較的高価なリソースに大量の小さな更新を行わないようにするために、内部でバッファリングを使用します。

Closeいずれかまたはほとんどのストリームで呼び出す必要がありDisposeます。そうしないと、コードが正しくありません。ガベージコレクターが来るまで(その時間がかかることを知っている)、他の誰かが使用できるように基になるリソースが解放されないためです Dispose。もちろん問題です。使い捨てのものはすべてC#で廃棄することが期待されています。Flushほとんどのシナリオでは、おそらく明示的に呼び出す必要はありません。

C#ではDispose、ブロックを介して呼び出すのが慣用的usingです。これは、finalで破棄するtry-finallyブロックの構文糖衣です。例:

using (FileStream stream = new FileStream(path))
{
    // ...
}

機能的にはと同じです

FileStream stream;

try
{
    stream = new FileStream(path);
    // ...
}
finally
{
    if (stream != null)
        stream.Dispose();
}
于 2009-12-08T04:27:34.820 に答える