なぜ弱参照が、ガベージコレクションによって標準のオブジェクト参照と同様に扱われる組み込み型ではないのか疑問に思います。C#では、WeakReferenceクラス(マネージヒープ自体に作成され、クリーンアップにファイナライザーを使用するため、パフォーマンスとメモリに大きな影響を与える)を使用するか、GCHandleを手動で割り当てる必要があります(後で手動で再度解放する必要があります)。 。
原則として、弱参照のGCは次のように実装します。
ライブオブジェクトを識別するために、GCはすべてのルートからオブジェクトツリーをウォークする必要があります。オブジェクトへの参照が見つかった場合、そのオブジェクトは到達可能としてマークされます。対照的に、オブジェクトへの弱参照が見つかった場合、これは最初のステップで無視されます。
2番目のステップでは、GCは到達不能なメモリブロックが配置されている場所を調べ、管理対象ヒープ(または少なくともその一部)を圧縮します。これを行うときは、オブジェクトツリーを再度ウォークし、移動されたオブジェクトへのすべての参照(通常および弱い)を更新する必要があります。さらに、到達可能としてマークされていないオブジェクトへの弱参照が見つかった場合、それを無効としてマークするには、null(または他の明確に定義された無効なメモリ位置)に設定する必要があります。