弱い参照Weak References

ガベージ コレクターでは、アプリケーションのコードがオブジェクトにアクセスできる間、そのアプリケーションで使用中のオブジェクトを収集することはできません。The garbage collector cannot collect an object in use by an application while the application's code can reach that object. アプリケーションには、オブジェクトへの強い参照があると考えられます。The application is said to have a strong reference to the object.

弱い参照は、アプリケーションからオブジェクトへのアクセスを許容したまま、そのオブジェクトをガベージ コレクターが収集できるようにします。A weak reference permits the garbage collector to collect the object while still allowing the application to access the object. 弱い参照は、強い参照が存在しない場合に、オブジェクトが収集されるまでの不確定の期間中のみ有効です。A weak reference is valid only during the indeterminate amount of time until the object is collected when no strong references exist. 弱い参照を使用すると、該当オブジェクトが収集されるのを回避するため、アプリケーションで強い参照を取得できます。When you use a weak reference, the application can still obtain a strong reference to the object, which prevents it from being collected. ただし、強い参照が再確立される前に、ガベージ コレクターが最初にオブジェクトにアクセスするリスクが常にあります。However, there is always the risk that the garbage collector will get to the object first before a strong reference is reestablished.

弱い参照は、多くのメモリを使用するが、ガベージ コレクションによって回収される場合、簡単に再作成できるオブジェクトに便利です。Weak references are useful for objects that use a lot of memory, but can be recreated easily if they are reclaimed by garbage collection.

Windows フォーム アプリケーションのツリー ビューに、複雑な階層形式のオプション選択がユーザーに示されているとします。Suppose a tree view in a Windows Forms application displays a complex hierarchical choice of options to the user. 基になるデータが大きければ、ユーザーがアプリケーションで他の操作を行っている場合、ツリーをメモリ内に保持しても効果的ではありません。If the underlying data is large, keeping the tree in memory is inefficient when the user is involved with something else in the application.

ユーザーがアプリケーションの別の部分に切り替えている場合、WeakReference クラスを使用して、ツリーへの弱い参照を作成し、すべての強い参照を破棄できます。When the user switches away to another part of the application, you can use the WeakReference class to create a weak reference to the tree and destroy all strong references. ユーザーがツリーに戻ると、アプリケーションはツリーへの強い参照を取得しようとします。成功した場合、ツリーの再作成は回避されます。When the user switches back to the tree, the application attempts to obtain a strong reference to the tree and, if successful, avoids reconstructing the tree.

オブジェクトで弱い参照を確立するには、追跡されるオブジェクトのインスタンスを使用して、WeakReference を作成します。To establish a weak reference with an object, you create a WeakReference using the instance of the object to be tracked. 次に、そのオブジェクトの Target プロパティを設定して、オブジェクトへの元の参照を null に設定します。You then set the Target property to that object and set the original reference to the object to null. コード例については、クラス ライブラリの「WeakReference」を参照してください。For a code example, see WeakReference in the class library.

短期間と長期間の弱い参照Short and Long Weak References

短期間の弱い参照または長期間の弱い参照を作成できます。You can create a short weak reference or a long weak reference:

  • ShortShort

    短期間の弱い参照の対象は、オブジェクトがガベージ コレクションによって回収されると、null になります。The target of a short weak reference becomes null when the object is reclaimed by garbage collection. 弱い参照自体が管理オブジェクトであり、その他の管理オブジェクトと同じようにガベージ コレクションの対象です。The weak reference is itself a managed object, and is subject to garbage collection just like any other managed object. 短期間の弱い参照は、WeakReference のパラメーターなしのコンストラクターです。A short weak reference is the parameterless constructor for WeakReference.

  • LongLong

    長期間の弱い参照は、オブジェクトの Finalize メソッドが呼び出された後も保持されます。A long weak reference is retained after the object's Finalize method has been called. これにより、オブジェクトが再作成されることを許可しますが、オブジェクトの状態は予測不可能なままです。This allows the object to be recreated, but the state of the object remains unpredictable. 長い参照を使用するには、WeakReference コンストラクターに true を指定します。To use a long reference, specify true in the WeakReference constructor.

    オブジェクトの型に Finalize メソッドがない場合、短期間の弱い参照の機能が適用され、弱い参照はターゲットが収集されるまで有効です。これはファイナライザーを実行した後であれば、いつでも発生する可能性があります。If the object's type does not have a Finalize method, the short weak reference functionality applies and the weak reference is valid only until the target is collected, which can occur anytime after the finalizer is run.

強い参照を確立して、もう一度オブジェクトを使用するには、オブジェクトの型に WeakReferenceTarget プロパティをキャストします。To establish a strong reference and use the object again, cast the Target property of a WeakReference to the type of the object. Target プロパティが null を返す場合、オブジェクトが収集されます。それ以外の場合、アプリケーションがその強い参照を再取得するため、オブジェクトを使用し続けることができます。If the Target property returns null, the object was collected; otherwise, you can continue to use the object because the application has regained a strong reference to it.

弱い参照を使用するためのガイドラインGuidelines for Using Weak References

終了処理後のオブジェクトの状態が予測できないため、長期間の弱い参照は必要な場合にのみ使用します。Use long weak references only when necessary as the state of the object is unpredictable after finalization.

ポインター自体が同程度の大きさか、より大きい場合があるため、小さなオブジェクトへの弱い参照を使用しないでください。Avoid using weak references to small objects because the pointer itself may be as large or larger.

メモリ管理の問題への自動的な解決方法として、弱い参照を使用しないでください。Avoid using weak references as an automatic solution to memory management problems. 代わりに、アプリケーションのオブジェクトを処理するために、効果的なキャッシュ ポリシーを開発します。Instead, develop an effective caching policy for handling your application's objects.

関連項目See also