このコンテキストでの「リソース」は、「オブジェクトが他のすべての人に損害を与えるために、追って通知があるまで、オブジェクトが他の何かに代わって実行するように要求したもの」を意味すると考えると最も役立ちます。オブジェクトを放棄すると、ガベージコレクターがオブジェクトに放棄を通知し、オブジェクトがその代わりに動作していたものにそれを停止するように指示する場合、オブジェクトは「管理対象リソース」を構成します。「非管理対象リソース」とは、管理対象リソース内にカプセル化されていないリソースです。
一部のオブジェクトがアンマネージメモリにハンドルを割り当てると、メモリマネージャにメモリの一部の領域の排他的使用を許可するように要求し、メモリマネージャに通知するFoo
まで、他の方法でそれを使用する可能性のある他のコードが使用できないようにします。Foo
メモリは不要になったため、他の目的で使用できるようにする必要があります。ハンドルをアンマネージリソースにするのは、APIを介して受信されたという事実ではなく、それへの意図的な参照がすべて放棄されたとしても、メモリマネージャーは、メモリの排他的使用をオブジェクトに永久に許可し続けるという事実です。もはやそれを必要とします(そしておそらくもはや存在しません)。
APIハンドルは最も一般的な種類の管理されていないリソースですが、他にも無数の種類があります。モニターのロックやイベントなどは、完全に.netのマネージコードの世界に存在しますが、ロックを取得してコードの待機中に放棄すると、そのコードが永久に待機する可能性があり、短命であるため、アンマネージリソースを表すことができます。存続期間のオブジェクトからイベントをサブスクライブし、放棄される前にサブスクライブ解除に失敗すると、存続期間の長いオブジェクトがイベント参照を無期限に持ち越し続ける可能性があります(1つのサブスクライバーのみが放棄された場合の小さな負担ですが、無制限の負担無制限の数のサブスクライバーが作成され、放棄された場合)。
補遺
ガベージコレクタの基本的な前提は、オブジェクトXがオブジェクトYへの参照を保持している場合、XがYに「関心がある」ためです。ただし、状況によっては、XがYに参照を保持させたいため、参照が保持される場合があります。 Yがどちらの方法でも「気にしない」としても、それに。このような状況は、通知イベントハンドラーで頻繁に発生します。オブジェクトYは、オブジェクトXに何かが発生するたびに通知を受ける必要がある場合があります。Xは、そのような通知を実行できるようにYへの参照を保持する必要がありますが、X自体は通知を気にしません。一部のルート化されたオブジェクトがYがそれらを受信することを気にする可能性があるという推定のために、それらを実行するだけです。
場合によっては、「弱いイベントパターン」と呼ばれるものを使用することが可能です。残念ながら、.netには多くの弱いイベントパターンがありますが、適切なWeakDelegate
タイプがないため、それらすべてに癖と制限があります。さらに、弱いイベントは役に立ちますが、万能薬ではありません。たとえば、Y
寿命の長いオブジェクトX
に何かが発生したときに通知するように要求したとします。既存の参照Y
は、そのX
ような通知に使用するものだけでY
あり、そのような通知で行うのは、あるオブジェクトのプロパティをインクリメントすることだけZ
です。そのプロパティを設定すると、外部では何も変更されませんZ
。そのシナリオでは、オブジェクトZ
が宇宙でオブジェクトを「気にする」唯一のものであるとしてもY
、Z
は何も参照しY
ないため、ガベージコレクターはY
の存続期間をの存続期間に結び付ける方法がありませんZ
。aX
がに強い言及を持っている場合Y
、後者は誰もそれに興味を持っていなくても生き続けます。X
弱参照しかない場合は、興味がY
あってもガベージコレクションされる可能性があります。ガベージコレクターが関心のZ
あるものを自動的に推測できるメカニズムはありません。Z
Y