6

Closeアクティブを呼び出すStreamWriterと、ストリームにこれ以上コードを書き込むことができなくなります (ストリームが閉じられているため)。StreamWriter別のストリームを開くには、「Open」メソッドがないため、新しいインスタンスを作成する必要があります。

私の質問は、ストリームを閉じた後以外に何も使用できない場合、持っCloseている意味は何ですか?DisposeDispose

機能があるかどうかは理解できましたOpen。つまり、あるファイルを閉じてから、同じ を使用して別のファイルを開くことができますStreamWriter。しかし、それしかなく、その後Close以外には何も使用できないため、最初のアクションとして、基礎となるストリームを削除して閉じてみませんか?DisposeCloseDispose

私はそれがすべてDisposeから来てIDisposeableいると思います。私が知りたいのは、とにかく呼び出すように見えるCloseときに特に必要な理由です。DisposeClose

StreamWriter私がClose見る限り、同じDispose.

それらがいつマージされて単一のメソッドになるかがStreamWriter気になるのはなぜですか?CloseCloseDispose

4

5 に答える 5

2

Closeストリームを処理する場合、ストリームを閉じなければならない方法である長年の慣習があります。これは、多くのプログラマーがストリームを処理するときに慣れており、見ることを期待している用語です。メソッドのないストリームがあると混乱する可能性があり、ストリームを閉じるためにClose使用する必要があることに人々が気付くのに時間がかかった可能性があります。Dispose

クラスが明示的に実装されている可能性は確かにあります。そのため、メソッドはへのキャストなしでは存在せず、私は混乱の一部をクリーンアップしましたが、彼らはそれを行わず、2つの重複するメソッドをクラス。IDisposableDisposeIDisposable

ストリームを使用するDisposeか閉じるかは、完全に個人の好み次第です。Close

于 2012-12-27T17:00:06.180 に答える
1

ドキュメントによると、 の値でClose呼び出すだけです。Disposetrue

  • このメソッドは、Close をオーバーライドします。

  • この Close の実装は、真の値を渡す Dispose メソッドを呼び出します。

  • Close を呼び出して、すべてのデータが基になるストリームに正しく書き出されるようにする必要があります。Close の呼び出しに続いて、StreamWriter に対するすべての操作で例外が発生する可能性があります。ディスクに十分なスペースがない場合、Close を呼び出すと例外が発生します。

DisposeIDisposableそれ自体は、解放する必要があるリソースを持つクラスによって使用されるから継承されます。

于 2012-12-27T16:48:18.740 に答える
0

ストリームを開くと、アプリケーション リソースとシステム リソースの両方が割り当てられます。アプリケーションが多くのストリームを閉じずに開くと、他のアプリケーションがそれらのファイルにアクセスする機能が制限されます。ストリームをできるだけ早く閉じることが重要です。

ストリームが再度開くことができない理由に関しては、これは基本的に .NET のアプローチです。クラスはオープン ストリームを表します。そのため、ストリームにアクセスするための 1 つを作成し、できるだけ早く削除してください。ストリームに再度アクセスする場合は、別のストリームを作成します。

再度開くことができるストリーム クラスを作成することは有効だと思いますが、ストリームが閉じられたときに多くのメソッドが機能しないため、いくつかの問題が発生します。最後に、ストリーム クラスは実際にはオープンストリームを表します。

Disposeストリームがタイムリーに確実にクリーンアップされるようにするためのものです。

于 2012-12-27T16:48:20.283 に答える
0

close を取り除き、最初のアクションとして基になるストリームを閉じて破棄しないのはなぜですか?

それは良いプログラミングの練習です。

家を出ると自動的に消える照明があるとします。外出時に電気を消す必要はありませんが、良い習慣です。そうすれば、住んでいるすべての家で自動的に電気を消す必要がなくなります。あなたは自分でそれらをオフにする習慣があるでしょう.

明示的に呼び出すClose()と、リーダー (およびシステム) に「このストリームは終了しました」と通知され、呼び出しDispose()はシステム (およびリーダー) に「埋め込まれたリソースを解放できます」と通知します。

于 2012-12-27T16:53:02.883 に答える
-1

あなたが「なぜただ取り除けないのか...」と言うとき、それが後ろ向きであることを除いて、あなたは正しい軌道に乗っています。基礎となるコードを見ると、次のStreamWriter.Close()ことがわかります。

public override void Close()
{
  this.Dispose(true);
  GC.SuppressFinalize((object) this);
}

したがって、Close()メソッドは、ストリームへの書き込みが完了したことをフレームワークに通知する方法にすぎません。

于 2012-12-27T16:49:49.093 に答える