WeakReference クラス
アセンブリ: mscorlib (mscorlib.dll 内)

<SerializableAttribute> _ <ComVisibleAttribute(True)> _ Public Class WeakReference Implements ISerializable

共通言語ランタイムのガベージ コレクションの機構は、アクセスできないオブジェクトをメモリからクリアします。オブジェクトの参照が null 参照 (Visual Basic では Nothing) に設定された場合など、直接、間接を問わずオブジェクトへのすべての参照が無効になると、そのオブジェクトにはアクセスできなくなります。アクセス可能なオブジェクトへの参照は、"強い参照" と呼ばれます。
弱い参照でも、アクセス可能なオブジェクトを参照します。このようなオブジェクトはターゲットと呼ばれます。ユーザーがターゲットへの強い参照を作成するには、Target プロパティの値を変数に割り当てます。ただし、強い参照で参照されないターゲットは、弱い参照で参照されていてもガベージ コレクションの対象になります。
オブジェクトがガベージ コレクションの対象になる時点と、このオブジェクトが収集される時点との間に遅延が生じることがあります。ターゲットの収集後に、ユーザーがそのターゲットを取得しようとした場合、null 参照だけが取得されます。ターゲットがまだ収集されていない場合には、有効な参照を取得できます。
Finalize メソッドが存在し、さらにこのメソッドを呼び出すように指示されている場合には、ガベージ コレクションは、オブジェクトに対してこのメソッドを呼び出します。つまり、終了処理が実行されます。終了処理が完了した後に、ユーザーが現在の WeakReference オブジェクトの IsAlive プロパティまたは Target プロパティを使用してオブジェクトにアクセスしようとすると、InvalidOperationException がスローされます。
用語オブジェクトとガベージ コレクションを記述する際に使用するいくつかの専門用語を知っておくと役立ちます。アクセス可能で使用できるオブジェクトは、生きている状態のオブジェクトです。未使用でガベージ コレクションの対象となるオブジェクトは、死んでいる状態のオブジェクトです。死んでいる状態のオブジェクトへの強い参照が取得されると、そのオブジェクトは再び生きている状態になります。このオブジェクトは再生したことになります。
WeakReference オブジェクトは、終了後にターゲットへの参照を維持するかどうか、つまり、弱い参照によりターゲットの再生を追跡するかどうかを指定できます。再生を追跡しない弱い参照は、"短い弱い参照" と呼ばれます。再生を追跡する弱い参照は、"長い弱い参照" と呼ばれます。
WeakReference オブジェクトのキャッシュに、アプリケーションで使用されるオブジェクトのセットへの参照が維持されるコード例で、WeakReference クラスがよく使用されます。たとえば、オブジェクトがスコープ外であるために死んだ状態になった場合でも、ガベージ コレクション機構は割り当てられたメモリをクリアできます。
この例を使用して優れたメモリ管理スキームについて説明した場合、誤解を招く可能性があります。WeakReference クラスをメモリ管理の問題に対する自動的な解決策として扱うことができないためです。キャッシュで保有または削除するエントリについて、アプリケーションの規則、つまりキャッシュ ポリシーを確立する必要があります。

- SecurityPermission (アンマネージ コードを呼び出すために必要なアクセス許可)。要求値 : InheritanceDemand; アクセス許可値 : UnmanagedCode

System.WeakReference


Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


WeakReference コンストラクタ (Object, Boolean)
アセンブリ: mscorlib (mscorlib.dll 内)

Dim target As Object Dim trackResurrection As Boolean Dim instance As New WeakReference(target, trackResurrection)

trackResurrection が false の場合は短い弱い参照が作成されます。trackResurrection が true の場合は長い弱い参照が作成されます。通常、短い弱い参照だけが必要です。

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


WeakReference コンストラクタ

名前 | 説明 |
---|---|
WeakReference (Object) | 指定したオブジェクトを参照する、WeakReference クラスの新しいインスタンスを初期化します。 .NET Compact Framework によってサポートされています。 |
WeakReference (Object, Boolean) | 指定したオブジェクトを参照し、指定した再生処理追跡を使用する WeakReference クラスの新しいインスタンスを初期化します。 .NET Compact Framework によってサポートされています。 |
WeakReference (SerializationInfo, StreamingContext) | 指定したシリアル化およびストリーム オブジェクトからの逆シリアル化されたデータを使用して、WeakReference クラスの新しいインスタンスを初期化します。 |

WeakReference コンストラクタ (SerializationInfo, StreamingContext)
アセンブリ: mscorlib (mscorlib.dll 内)

Dim info As SerializationInfo Dim context As StreamingContext Dim instance As New WeakReference(info, context)



Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


WeakReference コンストラクタ (Object)
アセンブリ: mscorlib (mscorlib.dll 内)



Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition
開発プラットフォームの中には、.NET Framework によってサポートされていないバージョンがあります。サポートされているバージョンについては、「システム要件」を参照してください。


WeakReference プロパティ
WeakReference メソッド

名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 ( Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 ( Object から継承されます。) |
![]() | GetObjectData | SerializationInfo オブジェクトに、現在の WeakReference オブジェクトをシリアル化するために必要なすべてのデータを格納します。 |
![]() | GetType | 現在のインスタンスの Type を取得します。 ( Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 ( Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 ( Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Finalize | オーバーライドされます。 現在の WeakReference オブジェクトが表すターゲットへの参照を破棄します。 |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 ( Object から継承されます。) |

WeakReference メンバ
"弱い参照" を表します。弱い参照は、オブジェクトがガベージ コレクションの対象になっている状態のままで、そのオブジェクトを参照します。
WeakReference データ型で公開されるメンバを以下の表に示します。




名前 | 説明 | |
---|---|---|
![]() | Equals | オーバーロードされます。 2 つの Object インスタンスが等しいかどうかを判断します。 (Object から継承されます。) |
![]() | GetHashCode | 特定の型のハッシュ関数として機能します。GetHashCode は、ハッシュ アルゴリズムや、ハッシュ テーブルのようなデータ構造での使用に適しています。 (Object から継承されます。) |
![]() | GetObjectData | SerializationInfo オブジェクトに、現在の WeakReference オブジェクトをシリアル化するために必要なすべてのデータを格納します。 |
![]() | GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) |
![]() | ReferenceEquals | 指定した複数の Object インスタンスが同一かどうかを判断します。 (Object から継承されます。) |
![]() | ToString | 現在の Object を表す String を返します。 (Object から継承されます。) |

名前 | 説明 | |
---|---|---|
![]() | Finalize | オーバーライドされます。 現在の WeakReference オブジェクトが表すターゲットへの参照を破棄します。 |
![]() | MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) |

弱い参照
(WeakReference から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/02/10 17:42 UTC 版)
ナビゲーションに移動 検索に移動![]() | この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。 出典を追加して記事の信頼性向上にご協力ください。(2011年10月) |
弱い参照(英: weak reference、ウィークリファレンス)あるいは弱参照とは、参照先のオブジェクトをガベージコレクタから守ることのできない参照のことである。弱い参照からのみによって参照されるオブジェクトは到達不可能とみなされ、従っていつでも解放することができる。弱い参照は、通常の参照(強い参照、強参照)による諸問題を解決するために用いられる。PythonやJavaをはじめとするガベージコレクタを実装したオブジェクト指向プログラミング言語の多くは、弱い参照を実装している。
概要
ガベージコレクタ (GC) はメモリオブジェクトのライフサイクル管理を自動化し、メモリリークを防ぐために用いられる。GCの方式のひとつとして参照カウント方式があり、これはオブジェクトごとに参照の数を記録する領域(参照カウンタ)を用意し、その数が0になった時点でオブジェクトを解放するというものである。この方式のGCは、あるオブジェクト間で参照が循環した場合にそれらを解放することができない(循環参照)。そのため、相互に参照しあったオブジェクト群はメモリリークの原因となる。この問題は、強い参照を弱い参照で置き換えることで解決することが可能な場合がある。一方、マーク・アンド・スイープ方式やコピーGC方式では循環参照によるメモリリークは発生しないが、非意図的オブジェクト保持(unintentional object retention)が引き起こすメモリリークを強参照のみによる実装で解消することは難しく煩雑であり、実装を簡略化するために弱参照が用いられることがある。
弱い参照のうち、さらに複数の強度を持つ言語もある。例えば、Javaにはjava.lang.ref
パッケージにて、弱い参照WeakReference
、ファントム参照PhantomReference
、ソフト参照SoftReference
が定義されている。また、WeakReference
によるハッシュテーブルとしてjava.util.WeakHashMap
が定義されている。C++のように、元々ガベージコレクタのない言語で、その代替機能をライブラリでサポートし、その中で弱い参照・強い参照の機能を提供しているものもある。例えば参照カウント方式のスマートポインタを実現するC++のクラステンプレートとして、Boost C++ライブラリのboost::shared_ptr
やC++11以降のstd::shared_ptr
が存在するが、これらは「強い参照」に該当する。対応する「弱い参照」は、それぞれboost::weak_ptr
とstd::weak_ptr
である。通常の(言語組み込みの)ポインタは参照の数に影響しないと言う意味で「弱い参照」と考えることもできるが、弱い参照はオブジェクトが到達不可能になったことを知っているべきなので、ポインタは本当の意味での弱い参照ではない。
弱い参照が便利なひとつの例として、アプリケーション内で参照されている変数を追跡するケースがある[1]。この追跡リストは、対象オブジェクトに対して弱い参照で参照しなければならない(弱いコレクション)。そうしなければ、一度リストに加えられたオブジェクトはリストによって参照されるため、プログラムが停止するまで半永久的に解放されることはない。
脚注
関連項目
- WeakReferenceのページへのリンク