web-dev-qa-db-ja.com

ストリームとその存続期間を理解する(フラッシュ、破棄、閉じる)

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

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

ストリームを使用するC#

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

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

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

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

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

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

24
Omar

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

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

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

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

機能的にはと同じです

FileStream stream;

try
{
    stream = new FileStream(path);
    // ...
}
finally
{
    if (stream != null)
        stream.Dispose();
}
34
mqp