IDisposable
いいえ、決定的に破棄する必要があるのは、インターフェイスを実装するオブジェクトだけです。理想的には、それらをラップして、メソッドを手動でusing statement
呼び出さないでください。.Dispose
using (var conn = new SqlConnection(ConnectionString))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT foo FROM bar";
using (var reader = cmd.ExecuteCommand())
{
while (reader.Read())
{
// TODO: consume your resultset
}
}
}
またはストリーム:
using (var stream = new MemoryStream())
{
...
}
またはファイル:
using (var file = File.OpenRead())
{
...
}
または読者:
using (var reader = XmlReader.Create("foo.xml"))
{
...
}
このIDisposable
パターンは、破棄する必要があるアンマネージド オブジェクトへの参照をオブジェクトが保持しており、CLRT がそれらのアンマネージド リソースを自動的に追跡および破棄できない場合に、.NET で使用されます。この場合、開発者は、それらを使い終わったらすぐに (using statements
前に示したようにラップすることによって) 決定論的に破棄する必要があります。IDisposable インターフェイスを実装しない他のすべてのオブジェクトについては、メモリ管理を CLR と Grbage Collector に任せる必要があります。CLR はそれらを追跡し、それらを指している参照がなくなると保持しているメモリを自動的に解放します。開発者として、あなたはそれについて心配する必要はありません。
したがって、経験則は次のとおりです。
変数をインスタンス化するとき、この変数が IDisposable を実装している場合は using ステートメントでラップし、そうでない場合はガベージ コレクターに任せます。