1

メソッドのローカル変数である読み取り専用のFileStreamがあります。

public void SomeMethod()
{
   var fileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
   ... //some stream operations
}

メソッドの最後でDisposeを(明示的にまたは「使用して」)呼び出す必要がありますか?何が変わりますか?

4

6 に答える 6

4

それが何をするかは問題ではなく、IDisposableによって実装されるため、使用が終了したら暗黙的または明示的にFileStream呼び出す必要があります。Disposeこれは、コードでクラスを使用する契約の一部です。

于 2013-03-14T19:42:00.623 に答える
3

usingそれを文にまとめた方がいいと思います。そのコードを堅牢にしたい場合は、例外処理も必要です。それは今のように機能しますが、それはただの悪い習慣です。

于 2013-03-14T19:41:51.767 に答える
3

実装しているインスタンスを破棄することは必須であり、ステートメントIDisposableを通じて破棄することをお勧めします。using

特にすべてのケースを分析することが役立つとは思わないでください。

于 2013-03-14T19:42:04.080 に答える
2

破棄に失敗した場合FileStream、GC が起動するまで (非決定論的に) は閉じられません。

そして、これが起こるまで、開いているファイル ハンドルを保持し、ファイルへのいくつかのタイプのアクセス (書き込み、削除など) を防ぎます。

FileShare.ReadWrite指定が必ずしも役立つとは限らないことに注意してください。別のライターがFileShare.None(たとえば を呼び出してFile.OpenWrite) を使用してファイルを開こうとした場合、ファイルを閉じるまでそのライターは開くことができません。

したがって、はい、usingステートメントでファイルを閉じてください。

于 2013-03-14T19:45:44.180 に答える
0

オブジェクトを破棄できる場合は、必要がなくなったらできるだけ早く破棄する必要があります。FileStream クラスのトピックから:

ファイルの一部がロックされた状態でプロセスが終了した場合、または未解決のロックがあるファイルを閉じた場合の動作は未定義です。

于 2013-03-14T19:45:27.017 に答える
0

誰もが示唆したように:IDisposable好ましくはと一緒に、すべてを処分してusingください。

ファイルの場合、他のすべての人がファイルにアクセス/変更するのを本当にブロックしたい場合があります。この場合、ある時点でまだファイルを破棄しますが、この「ある時点」は、コード/アプリケーションの有効期間のかなり後である可能性があります。

于 2013-03-14T19:46:16.173 に答える