決定論的なクリーンアップが必要なリソースがあるとき、つまり、使い終わったらすぐに「破棄」できるようにしたいとき。
より詳細には、IDisposible インターフェースは主に、.net 言語に「delete」キーワードがないことを解決しようとします。CLR はガベージ コレクトされるため、オブジェクトのファイナライザー (デストラクター) がいつ実行されるかはわかりません。GC は、管理対象リソースを解放する前に、好きなだけ待機することができます。
ただし、多くの管理対象リソースは、基礎となる有限リソースをラップしています。割り当てと割り当て解除が必要なのはメモリだけではありません。前述のように、ファイル ハンドルは 1 つです。データベースは別のものを処理します - 無数の例があります。一貫性のないクリーンアップ イディオムの混乱を避けるために、IDisposible パターンを使用して、「有限のリソースを解放してください。私はそれらを使い果たしました」と言います。これはフレームワークに組み込まれているため、"using" を介して特別な言語サポートを取得し、Dispose メソッドの呼び出しを忘れないようにして、アンマネージ リソースを "リーク" させないようにします。
これは、すべてのIDisposible 実装者を using でラップする必要があるという意味ではありません。参照を保持していて、将来それらが必要になる場合は、基礎となるリソースの早期リリースを引き起こすため、それらをラップしないでください。Disposeは、オブジェクトの使用が終了したときにのみ呼び出します。したがって、使用中のスコープが終了した後で、使用が終了したことがわかっている場合にのみ、「使用中」にラップします。
したがって、当然のことながら、C++/CLI などの決定論的破壊を行う言語では、"using" は必要ありません。ヒープ以外の C++/CLI オブジェクトは、スコープ外になると Dispose メソッドが自動的に呼び出され、パターンがキャプチャしようとするデストラクタの動作を模倣します。