8

プログラミングの知識にかなり落ち込んでいますが、本当に FileStream Object を破棄する必要がありますか?

私が尋ねている理由は、コードが「別のプロセスによって使用されているファイル」例外を100回に1回スローしているためです。

コードについては、この質問を参照してください。

100回に1回しか発生しないので混乱し、本番サーバーで発生しているため、まったくデバッグできませんが、開発マシンでは完全に機能します...

4

3 に答える 3

6

もちろん、処分しない十分な理由がない限り、使い捨て可能なものはすべて処分する必要があります。

デフォルトですべてをusingブロックに入れます。手動で呼び出す場合Close、これはコードの匂いです。

于 2013-09-18T11:18:23.297 に答える
6

使い捨てるものはすべて処分するのが原則です。

の特定のケースではFileStream、ファイルを閉じるために破棄する必要はありませんClose。メソッドを使用するだけで済みます。

FileStreamただし、ファイナライザーがあるため、とにかくオブジェクトを破棄する必要があります。これにより、オブジェクトがファイナライザー キューから削除され、1 回のパスでガベージ コレクションできるプレーン オブジェクトになります。破棄しないと、ガベージ コレクターはFinalizerメソッドを実行する必要があり、後になるまで収集できないため、メモリ内に長く残ります。

usingとにかくオブジェクトを破棄する必要があるため、ブロックに入れることができます。これによりDisposeメソッドが呼び出され、次にそのメソッドがCloseメソッドを呼び出すため、自分で行う必要はありません。

using (System.IO.FileStream stream = System.IO.File.Create(Path + file.Name)) {
  stream.Write(document, 0, document.Length);
}
于 2013-09-18T11:31:56.420 に答える
1

クラスが を実装している場合はIDisposable、ガベージ コレクターに頼るのではなく、すべてのリソースができるだけ早く閉じられるように破棄する必要があります。usingさらに良いことに、例外が発生した場合でも閉じられるように、ブロックでラップします。

using (var stream = new FileStream(...))
{
   // do stuff with stream
}
于 2013-09-18T11:19:38.600 に答える