6

次の状況で呼び出す必要があるかどうか疑問に思っていClose()ました (必要でない場合、なぜですか?)

using (var file = System.IO.File.OpenText(myFilePath))
{
...
}

次のような場合に必要だと思います

StreamWriter file2 = new System.IO.StreamWriter(myFilePath);
newFileContents.ForEach(file2.WriteLine);
file2.Close();

それが正しいか?

編集:

私の質問は close() だと思いました-具体的で、読み書きの違いだったのかもしれません....

4

6 に答える 6

11

usingコンストラクトを使用IDisposable.Disposeすると、ファイルを閉じるコード ブロックの最後で自動的に呼び出されます。ステートメントを使用しない場合は、using自分で Close を呼び出す必要があります。

また、組み込みの try/finally 例外処理も自動的に取得され、ブロックusingを終了する前に何か問題が発生した場合に、より適切に動作します。これは、自分で作成するのではなく、using使用することをお勧めするもう 1 つの理由です。using

あなたの場合、usingコンストラクトは次の省略形です。

StreamWriter file2 = new System.IO.StreamWriter(myFilePath);
try
{
   newFileContents.ForEach(file2.WriteLine);
}
finally
{
   if (file2!= null)
       ((IDisposable)file2).Dispose();
}

StreamWriter の Dispose の実装を逆コンパイルすると、(特に) 次の呼び出しが表示されます。

this.stream.Close();

finally ブロック内 (絶対的な証拠が必要な場合 ;-)

于 2013-02-27T19:09:20.153 に答える
2

OpenTextは、メソッドを指定するインターフェースを継承するStreamReaderを返します。 TextReaderIDisposableDispose()

ステートメントがusingスコープ外になると、StreamReader の Dispose() の実装で Dispose() メソッドが呼び出され、ストリーム (つまり、基になるファイル) が閉じられます。全体がカバーの下のtry/finallyブロックにラップされています。 Dispose() が常に呼び出されることを保証します。

于 2013-02-27T19:12:29.937 に答える
0

次の状況で Close() を呼び出す必要があるかどうか疑問に思っていました (必要でない場合、なぜですか?)

いいえ、usingステートメントはオブジェクトを破棄するため、管理されていないリソースが削除されます。

次のような場合に必要だと思います

はい、ここでは、管理されていないリソースをクリーンアップするために必要です。

于 2013-02-27T19:10:06.937 に答える
0

正しい。

  1. using 句でラップされている場合、afile.Close()は必要ありません
  2. 包装されていない場合は、お客様の責任とClose()なります。Dispose()
于 2013-02-27T19:10:06.920 に答える
0

基になるファイルを閉じるため、必要ありません。Dispose()ただし、これは実装の詳細であるためClose()、ストリームを使い終わったら明示的に呼び出すことをお勧めします。

于 2013-02-27T19:10:35.943 に答える
0

using 構造体は、スクリプト ブロックの最後に到達すると、オブジェクトの Dispose メソッドを呼び出します。このメソッドはファイルを閉じます。

ファイルを操作するときはいつでも、ファイルが自由に編集できることを Windows に知らせるために、必ず Dispose または Close を呼び出す必要があります。

于 2013-02-27T19:10:01.393 に答える