4

usingオブジェクトをインスタンス化するためにキーワードを実装するとき、それはオブジェクトで呼び出されるIO.StreamWriterことを意味しますか?それとも、使用が終了すると範囲外になり、とにかくガベージコレクションされるので、それは重要ですか?.close.dispose

4

2 に答える 2

7

usingキーワードはを呼び出しますDispose。ただし、慣例によりDisposeCloseは常にまったく同じ機能を実行し、交換可能である必要があります。

そのため、派生クラスなど、メソッドをIDisposable提供するだけでなく提供するリソースは、ブロック内で使用できます。Close()Streamusing

これは、フレームワーク設計ガイドラインで明示的に対処されています。「実装を「...」Closeと同一にすることが重要です。Dispose

IDisposableのMSDNヘルプでも、次のように提案されています。「このような規則を持つクラスの実装者は、Disposeメソッドを呼び出すCloseなどのカスタマイズされた名前でパブリックメソッドを実装することを選択できます。」

それとも、使用が終了すると範囲外になり、とにかくガベージコレクションされるので、それは重要ですか?

ガベージコレクションは行われません。スコープ内になくなり、オブジェクトから参照されなくなった後は、ガベージコレクションの対象になります。これは、(少なくとも適切に記述されている場合)最終的にはクリーンアップされることを意味しますが、プログラムが終了するまでを含め、長期間は発生しない可能性があります。usingブロックを使用すると、ストリームなどのリソース(メモリではなく)がすぐに閉じられます。

于 2012-07-31T20:09:03.590 に答える
2

UsingDisposeスコープの最後でのみ呼び出します。ただし、などのクラスの場合、StreamWriter内部的Disposeに呼び出すことになります。Close

それとも、使用が終了すると範囲外になり、とにかくガベージコレクションされるので、それは重要ですか?

Usingこれは誤解です。ブロックとメソッドの全体的な理由はDispose、オブジェクトがスコープの最後ですぐにガベージコレクションされないことです。

于 2012-07-31T20:09:28.760 に答える