2

GAC の「System.IO.File.AppendAllText」コードを見ると、「InternalAppendAllText」という別のメソッドが呼び出され、新しい StreamWriter が作成され、コンテンツがファイルに書き込まれます。

//mscorlib, System.IO
private static void InternalAppendAllText(string path, string contents, Encoding encoding)
{
    using (StreamWriter writer = new StreamWriter(path, true, encoding))
    {
      writer.Write(contents);
    }
}

私の質問は、たとえば、System.IO.AppentAllText を 5 回呼び出す for ループを実行した場合、StreamWriter は 5 回作成され、反復ごとに初期化および破棄されるか、または 1 回だけ初期化されますか?

例:

for(int i = 1; i < 4; ++i)
{
    System.IO.File.AppendAllText("a", "a");
}
4

2 に答える 2

6

ブロックは、using次のコードに相当するものに展開されます。

StreamWriter writer;
try
{
    writer = new StreamWriter(path, true, encoding))
    writer.Write(contents);
}
finally
{
    if (writer != null)
         writer.Dispose();
}

そうです、usingブロックが終了するたびに、オブジェクトは破棄されます。関数を再入力するたびに、新しいStreamWriterが初期化されます。

ただし、これはガベージ コレクターとは関係がないことに注意してください。GC は気が向いたときに実行され、割り当てられたオブジェクトをスキャンし、StreamWriterどの GC ルートにもアタッチされていないオブジェクトが 5 つあることに気付き、それらを破棄します。これは、 を呼び出しDisposeたり使用usingしたりしたかどうかに関係なく、GC がどのように機能するかだけに当てはまります。

ここで行うことは、オブジェクトが保持するアンマネージリソース (この場合はファイル ハンドルusing) を解放することです。が破棄されていないか、明示的に閉じられていない場合、プロセスが終了するか GC がアクティブ化を決定するまで、ファイルは編集のためにロックされたままになります。これがブロックとインターフェイスの目的です。GC が認識していないオブジェクトを明示的に解放するようにするためです。StreamWriterusingIDisposable

于 2012-11-25T21:00:33.990 に答える
3

逆コンパイルされたコードを見ると、ストリームは using ステートメントにあるため、クリーンアップされます。5 回すべて初期化されますが、コードが using ステートメントを離れるとすぐにクリーンアップされます。

于 2012-11-25T20:56:11.587 に答える