更新 : 2007 年 11 月
"弱い参照" を表します。弱い参照は、オブジェクトがガベージ コレクションによるクリアの対象になっている状態のままで、そのオブジェクトを参照します。
名前空間 :
System
アセンブリ :
mscorlib (mscorlib.dll 内)
<SerializableAttribute> _
<ComVisibleAttribute(True)> _
<SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags := SecurityPermissionFlag.UnmanagedCode)> _
Public Class WeakReference _
Implements ISerializable
Dim instance As WeakReference
[SerializableAttribute]
[ComVisibleAttribute(true)]
[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public class WeakReference : ISerializable
[SerializableAttribute]
[ComVisibleAttribute(true)]
[SecurityPermissionAttribute(SecurityAction::InheritanceDemand, Flags = SecurityPermissionFlag::UnmanagedCode)]
public ref class WeakReference : ISerializable
/** @attribute SerializableAttribute */
/** @attribute ComVisibleAttribute(true) */
/** @attribute SecurityPermissionAttribute(SecurityAction.InheritanceDemand, Flags = SecurityPermissionFlag.UnmanagedCode) */
public class WeakReference implements ISerializable
public class WeakReference implements ISerializable
弱い参照を利用することで、オブジェクトがガベージ コレクタに収集される場合でも、アプリケーションからオブジェクトにアクセスすることができます。オブジェクトが必要な場合には、オブジェクトに対する厳密な参照を取得して収集されないようにすることもできます。短い形式および長い形式の弱い参照の使用方法については、「弱い参照」を参照してください。
次の例では、弱い参照を使用してオブジェクトのキャッシュをアプリケーションのリソースとして保持する方法を示します。キャッシュは、インデックス値によってキーを設定された WeakReference オブジェクトの IDictionary<(Of <(TKey, TValue>)>) を使用して構築されます。WeakReference オブジェクトの Target プロパティは、データを表すバイト配列内のオブジェクトです。
この例では、キャッシュ内のオブジェクトにランダムにアクセスします。オブジェクトがガベージ コレクションのために解放される場合は、新しいデータ オブジェクトが再生成されます。それ以外の場合は、弱い参照によりオブジェクトにアクセスできます。
Imports System
Imports System.Collections.Generic
Public Class Module1
Public Shared Sub Main()
' Create the cache.
Dim cacheSize As Integer = 50
Dim r As Random = New Random
Dim c As Cache = New Cache(cacheSize)
Dim DataName As String = ""
' Randomly access objects in the cache.
Dim i As Integer
Do While i < c.Count
Dim index As Integer = r.Next(c.Count)
' Access the object by
' getting a property value.
DataName = c(index).Name
i += 1
Loop
'Show results.
Dim regenPercent As Double = c.RegenerationCount * 100 / c.Count
Console.WriteLine("Cache size: {0}, Regenerated: {1}%", c.Count.ToString(), regenPercent.ToString())
End Sub
End Class
Public Class Cache
' Dictionary to contain the cache.
Private Shared _cache As Dictionary(Of Integer, WeakReference)
' Track the number of times an
' object is regenerated.
Dim regenCount As Integer = 0
Public Sub New(ByVal count As Integer)
MyBase.New()
_cache = New Dictionary(Of Integer, WeakReference)
' Add data objects with a short
' weak reference to the cache.
Dim i As Integer = 0
Do While (i < count)
_cache.Add(i, New WeakReference(New Data(i)))
i = (i + 1)
Loop
End Sub
' Number of items in the cache.
Public ReadOnly Property Count() As Integer
Get
Return _cache.Count
End Get
End Property
' Number of times an
' object needs to be regenerated.
Public ReadOnly Property RegenerationCount() As Integer
Get
Return regenCount
End Get
End Property
' Access a data object from the cache.
' If the object was reclaimed for garbage collection,
' create a new data object at that index location.
Default Public ReadOnly Property Item(ByVal index As Integer) As Data
Get
' Obtain an instance of a data
' object from the cache of
' of weak reference objects.
Dim d As Data = CType(_cache(index).Target, Data)
If (d Is Nothing) Then
' Object was reclaimed, so generate a new one.
Console.WriteLine("Regenerate object at {0}: Yes", index.ToString())
d = New Data(index)
regenCount += 1
Else
' Object was obtained with the weak reference.
Console.WriteLine("Regenerate object at {0}: No", index.ToString())
End If
Return d
End Get
End Property
End Class
' Class that creates byte arrays to simulate data.
Public Class Data
Private _data() As Byte
Private _name As String
Public Sub New(ByVal size As Integer)
MyBase.New()
_data = New Byte(((size * 1024)) - 1) {}
_name = size.ToString
End Sub
' Simple property for
' accessing the object.
Public ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
End Class
' Example of the last lines of the output:
' ...
' Regenerate object at 36: Yes
' Regenerate object at 8: Yes
' Regenerate object at 21: Yes
' Regenerate object at 4: Yes
' Regenerate object at 38: No
' Regenerate object at 7: Yes
' Regenerate object at 2: Yes
' Regenerate object at 43: Yes
' Regenerate object at 38: No
' Cache size: 50, Regenerated: 94%
'
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
// Create the cache.
int cacheSize = 50;
Random r = new Random();
Cache c = new Cache(cacheSize);
string DataName = "";
// Randomly access objects in the cache.
for (int i = 0; i < c.Count; i++)
{
int index = r.Next(c.Count);
// Access the object by
// getting a property value.
DataName = c[index].Name;
}
// Show results.
double regenPercent = c.RegenerationCount * 100 / c.Count;
Console.WriteLine("Cache size: {0}, Regenerated: {1}%", c.Count.ToString(), regenPercent.ToString());
}
}
public class Cache
{
// Dictionary to contain the cache.
static Dictionary<int, WeakReference> _cache;
// Track the number of times an
// object is regenerated.
int regenCount = 0;
public Cache(int count)
{
_cache = new Dictionary<int, WeakReference>();
// Add data objects with a
// short weak reference to the cache.
for (int i = 0; i < count; i++)
{
_cache.Add(i, new WeakReference(new Data(i), false));
}
}
// Returns the number of items in the cache.
public int Count
{
get
{
return _cache.Count;
}
}
// Returns the number of times an
// object had to be regenerated.
public int RegenerationCount
{
get
{
return regenCount;
}
}
// Accesses a data object from the cache.
// If the object was reclaimed for garbage collection,
// create a new data object at that index location.
public Data this[int index]
{
get
{
// Obtain an instance of a data
// object from the cache of
// of weak reference objects.
Data d = _cache[index].Target as Data;
if (d == null)
{
// Object was reclaimed, so generate a new one.
Console.WriteLine("Regenerate object at {0}: Yes", index.ToString());
d = new Data(index);
regenCount++;
}
else
{
// Object was obtained with the weak reference.
Console.WriteLine("Regenerate object at {0}: No", index.ToString());
}
return d;
}
}
}
// This class creates byte arrays to simulate data.
public class Data
{
private byte[] _data;
private string _name;
public Data(int size)
{
_data = new byte[size * 1024];
_name = size.ToString();
}
// Simple property.
public string Name
{
get
{
return _name;
}
}
}
// Example of the last lines of the output:
//
// ...
// Regenerate object at 36: Yes
// Regenerate object at 8: Yes
// Regenerate object at 21: Yes
// Regenerate object at 4: Yes
// Regenerate object at 38: No
// Regenerate object at 7: Yes
// Regenerate object at 2: Yes
// Regenerate object at 43: Yes
// Regenerate object at 38: No
// Cache size: 50, Regenerated: 94%
//
System..::.Object
System..::.WeakReference
この型のすべてのパブリック static (Visual Basic では Shared) メンバは、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。
Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile for Smartphone, Windows Mobile for Pocket PC, Xbox 360
.NET Framework および .NET Compact Framework では、各プラットフォームのすべてのバージョンはサポートしていません。サポートされているバージョンについては、「.NET Framework システム要件」を参照してください。
.NET Framework
サポート対象 : 3.5、3.0、2.0、1.1、1.0
.NET Compact Framework
サポート対象 : 3.5、2.0、1.0
XNA Framework
サポート対象 : 2.0、1.0
参照
その他の技術情報