プログラミングの知識にかなり落ち込んでいますが、本当に FileStream Object を破棄する必要がありますか?
私が尋ねている理由は、コードが「別のプロセスによって使用されているファイル」例外を100回に1回スローしているためです。
コードについては、この質問を参照してください。
100回に1回しか発生しないので混乱し、本番サーバーで発生しているため、まったくデバッグできませんが、開発マシンでは完全に機能します...
プログラミングの知識にかなり落ち込んでいますが、本当に FileStream Object を破棄する必要がありますか?
私が尋ねている理由は、コードが「別のプロセスによって使用されているファイル」例外を100回に1回スローしているためです。
コードについては、この質問を参照してください。
100回に1回しか発生しないので混乱し、本番サーバーで発生しているため、まったくデバッグできませんが、開発マシンでは完全に機能します...
もちろん、処分しない十分な理由がない限り、使い捨て可能なものはすべて処分する必要があります。
デフォルトですべてをusing
ブロックに入れます。手動で呼び出す場合Close
、これはコードの匂いです。
使い捨てるものはすべて処分するのが原則です。
の特定のケースでは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);
}
クラスが を実装している場合はIDisposable
、ガベージ コレクターに頼るのではなく、すべてのリソースができるだけ早く閉じられるように破棄する必要があります。using
さらに良いことに、例外が発生した場合でも閉じられるように、ブロックでラップします。
using (var stream = new FileStream(...))
{
// do stuff with stream
}