マネージコードの主な利点の1つは、組み込みのメモリ管理です。ポインタ、バッファサイズ、終了したメモリの解放などを追跡する必要はありません。管理された側面がそれを行います。
では、なぜIDisposable
インターフェースがあるのでしょうか。 MSDNによると、インターフェイスはウィンドウハンドルやファイルなどの管理されていないリソースを処理するためのものです。しかし、なぜDispose
メソッドを明示的に呼び出す(または使用するUsing
)必要があるのでしょうか。
- オブジェクトがスコープ外に出たときにCLRが追跡できず、
Dispose
自動的に呼び出すことができないのはなぜですか?
Public Function DoSomething() As String
Dim reader As New StreamReader("myfile.txt")
Dim txtFromFile As String = reader.ReadToEnd()
Return txtFromFile '<==== reader goes out of scope after this line, so call Dispose automatically
End Function
- 少なくとも、ガベージコレクターが最終的にそれに到達して電話をかけないのはなぜ
Dispose
ですか?
私は何が欠けていますか?
編集
何人かの人々(ここと提案する他の回答)は、GCが最終的にUsing
ガベージコレクションに取り掛かるだけなので、ガベージコレクションは十分ではないと示唆しています。その引数が.NETの他のオブジェクトと区別された理由がわかりません。また、オブジェクトがより多くのリソースを消費すると言う前に、次のことを考慮してください。IDisposable
IDisposable
IDisposable
- 上記のMSDN
IDisposable
は、リソース要件に関係なく、管理されていないオブジェクト用であると述べています - 非常にリソースを大量に消費する.NETオブジェクトを見てきました(System.Web.UI.PageまたはSystem.Data.Objects.ObjectContextはどうですか)。