2

以下のコードを見てください:

new StreamWriter("c:/myText.txt").Write("Some thing...");

と、

using (var streamWriter = new StreamWriter("c:/myText.txt")
{
    streamWriter.Write("Some thing...");
}

ファイルを作成する最初のコードですが、その中に「何か...」とは書かれていません。しかし、2 番目のコードも同様に機能し、その中に書き込みます。

この問題が発生する理由 違いはなんですか?

4

2 に答える 2

6

このStreamWriterクラスIDisposableは、解放する必要があるリソースを保持するか、オブジェクトがガベージ コレクションされる前に実行する必要があるクリーンアップ コードを保持することを意味します。

この場合、呼び出しDisposeによってストリームが閉じられ、そうする前に最後のデータがストリームに書き込まれる可能性があります。

コーディングすると、ストリームへの参照が保持されないため、ストリームを適切に閉じるためnew StreamWriter("c:/myText.txt").Write("Some thing...");に呼び出す方法がありません。Dispose

ガベージ コレクターが dispose を呼び出すことはありません明示的に行う必要があります。

コードの 2 番目のブロックは、ブロックが終了したときにusing自動的に呼び出されるステートメントを使用します。Disposeこれは、このコードを記述する正しい方法です。

于 2012-10-14T06:05:47.960 に答える
2

最初次のようになります。

new StreamWriter("c:/myText.txt").Write("Some thing..."); 

2番目は完全に機能します。最初の問題は、ストリームを閉じないことです。これは最終的には発生しますが (プログラムが終了したとき、またはガベージ コレクターが最終的にファイルをファイナライズしたときStreamWriter)、ブロックが終了するとすぐに、最初のファイルは適切に閉じられます。

于 2012-10-14T05:32:31.230 に答える