Share via


弱い参照

アプリケーションのコードがオブジェクトにアクセスできる間、そのアプリケーションで使用中のオブジェクトをガベージ コレクターが収集できません。 このようなアプリケーションは、そのオブジェクトに対する強い参照を持つアプリケーションと呼ばれます。

弱い参照では、アプリケーションがオブジェクトをアクセスしている間もガベージ コレクターがオブジェクトを収集することが許可されます。 弱い参照は、強い参照が存在しない場合に、オブジェクトが収集されるまでの不確定の期間中のみ有効です。 弱い参照を使用するときでも、該当オブジェクトが収集されるのを防止するため、アプリケーションで強い参照を取得できます。 ただし、強い参照が再確立する前にガベージ コレクターがオブジェクトにアクセスするリスクは常にあります。

弱い参照は、多くのメモリを使用するがガベージ コレクションでクリアされても簡単に再作成できるオブジェクトに使用すると便利です。

Windows フォーム アプリケーションのツリー ビューで、ユーザーに対して複雑な階層構造のオプションが表示されているとします。 基になるデータが大きい場合は、ユーザーがアプリケーションで他の操作をしている間、メモリ内にツリーを保持することは、効率がよくありません。

ユーザーが、アプリケーションの別の部分に切り替えているときは、WeakReference クラスを使用してツリーへの弱い参照を作成し、強い参照をすべて破棄できます。 ユーザーがツリーに戻ったときに、アプリケーションはツリーへの強い参照の取得を試み、成功すると、ツリーの再作成は行いません。

オブジェクトへの弱い参照を確立するには、追跡するオブジェクトのインスタンスを使用して、WeakReference を作成します。 次に、Target プロパティをそのオブジェクトに設定し、オブジェクトを null に設定します。 コード例については、クラス ライブラリの WeakReference を参照してください。

短期間の弱い参照および長期間の弱い参照

短期間の弱い参照または長期間の弱い参照を作成できます。

  • Short

    短期間の弱い参照のターゲットは、ガベージ コレクションでオブジェクトがクリアされると null になります。 弱い参照自体はマネージ オブジェクトで、他のマネージ オブジェクトと同様、ガベージ コレクションの対象です。 短期間の弱い参照は、WeakReference の既定のコンストラクターです。

  • Long

    長期間の弱い参照は、オブジェクトの Finalize メソッドが呼び出された後に保持されます。 これにより、オブジェクトが再作成できるようになりますが、オブジェクトの状態は予測できません。 長期間の参照を使用するには、WeakReference コンストラクターに true を指定します。

    オブジェクトの型に Finalize メソッドがない場合は、短期間の弱い参照の機能が適用され、弱い参照の有効期間は、ターゲットが収集されるまでの間になります。ターゲットの収集は、ファイナライザーの実行後は、いつでも起きる可能性があります。

強い参照を確立し、オブジェクトを再び使用するには、WeakReferenceTarget プロパティをそのオブジェクトの型にキャストします。 Target プロパティによって null が返される場合は、そのオブジェクトは収集済みです。それ以外の場合は、アプリケーションがそのオブジェクトに対する強い参照を再び取得しているため、使用し続けることができます。

弱い参照を使用するにあたってのガイドライン

終了処理後のオブジェクトの状態が予測できないため、長期間の弱い参照は必要な場合にのみ使用してください。

小さいオブジェクトに対しては、弱い参照を使用しないでください。ポインター自体が同程度の大きさであるか、より大きい場合があるためです。

メモリ管理の問題の自動的な解決方法として、弱い参照を使用しないでください。 代わりに、アプリケーションのオブジェクトを処理するための効果的なキャッシュ ポリシーを作成します。

参照

その他の技術情報

ガベージ コレクション