次の方法で共有


弱参照

アプリケーションのコードがそのオブジェクトに到達できる間、ガベージ コレクターはアプリケーションで使用中のオブジェクトを収集できません。 アプリケーションは、オブジェクトへの強い参照を持っていると言われます。

弱参照では、アプリケーションがオブジェクトにアクセスできるようにしながら、ガベージ コレクターがオブジェクトを収集できます。 弱参照は、厳密な参照が存在しない場合にオブジェクトが収集されるまでの不確定な時間の間にのみ有効です。 弱参照を使用する場合でも、アプリケーションはオブジェクトへの厳密な参照を取得できるため、収集されません。 ただし、厳密な参照が再確立される前に、ガベージ コレクターが最初にオブジェクトに到達するリスクは常にあります。

弱参照は、大量のメモリを使用するオブジェクトに役立ちますが、ガベージ コレクションによって再利用される場合は簡単に再作成できます。

Windows フォーム アプリケーションのツリー ビューに、ユーザーに対するオプションの複雑な階層選択が表示されているものとします。 基になるデータが大きい場合、ユーザーがアプリケーション内の他の何かに関与している場合、ツリーをメモリ内に保持することは非効率的です。

ユーザーがアプリケーションの別の部分に切り替えたときに、 WeakReference クラスを使用してツリーへの弱い参照を作成し、すべての強い参照を破棄できます。 ユーザーがツリーに戻ると、アプリケーションはツリーへの厳密な参照を取得しようと試み、成功した場合はツリーの再構築を回避します。

オブジェクトとの弱参照を確立するには、追跡するオブジェクトのインスタンスを使用して WeakReference を作成します。 コード例については、クラス ライブラリの WeakReference を参照してください。

短い弱参照と長い弱参照

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

  • 短い

    オブジェクトがガベージ コレクションによって再利用されると、短い弱参照のターゲットが null になります。 弱参照自体はマネージド オブジェクトであり、他のマネージド オブジェクトと同様にガベージ コレクションの対象となります。 短い弱参照は、 WeakReferenceのパラメーターなしのコンストラクターです。

  • 長い

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

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

厳密な参照を確立し、オブジェクトをもう一度使用するには、WeakReferenceTargetプロパティをオブジェクトの型にキャストします。 Target プロパティがnull返された場合、オブジェクトは収集されました。それ以外の場合は、アプリケーションがオブジェクトへの厳密な参照を回復したため、オブジェクトを引き続き使用できます。

弱参照を使用するためのガイドライン

オブジェクトの状態が最終処理後に予測できないので、必要な場合にのみ、長い弱参照を使用します。

ポインター自体は大きいか大きい可能性があるため、小さなオブジェクトへの弱い参照を使用しないでください。

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

こちらも参照ください