このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
Microsoft Edge をダウンロードする
Internet Explorer と Microsoft Edge の詳細情報
public ref class WeakReference
public ref class WeakReference : System::Runtime::Serialization::ISerializable
public class WeakReference
public class WeakReference : System.Runtime.Serialization.ISerializable
[System.Serializable]
public class WeakReference : System.Runtime.Serialization.ISerializable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class WeakReference : System.Runtime.Serialization.ISerializable
type WeakReference = class
type WeakReference = class
interface ISerializable
[<System.Serializable>]
type WeakReference = class
interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type WeakReference = class
interface ISerializable
Public Class WeakReference
Public Class WeakReference
Implements ISerializable
WeakReference
次の例では、弱い参照を使用して、アプリケーションのリソースとしてオブジェクトのキャッシュを維持する方法を示します。 キャッシュは、インデックス値によってキー付けされたオブジェクトを使用して
IDictionary<TKey,TValue>
WeakReference
構築されます。 オブジェクトの
WeakReference
プロパティは
Target
、データを表すバイト配列内のオブジェクトです。
この例では、キャッシュ内のオブジェクトにランダムにアクセスします。 オブジェクトがガベージ コレクション用に再利用されると、新しいデータ オブジェクトが再生成されます。それ以外の場合は、弱い参照のためにオブジェクトにアクセスできます。
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 = "";
GC.Collect(0);
// 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/(double)c.Count;
Console.WriteLine("Cache size: {0}, Regenerated: {1:P2}%", c.Count, regenPercent);
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 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));
// Number of items in the cache.
public int Count
get { return _cache.Count; }
// Number of times an object needs to be regenerated.
public int RegenerationCount
get { return regenCount; }
// Retrieve a data object from the cache.
public Data this[int index]
get {
Data d = _cache[index].Target as Data;
if (d == null) {
// If the object was reclaimed, generate a new one.
Console.WriteLine("Regenerate object at {0}: Yes", index);
d = new Data(index);
_cache[index].Target = d;
regenCount++;
else {
// Object was obtained with the weak reference.
Console.WriteLine("Regenerate object at {0}: No", index);
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%
open System
open System.Collections.Generic
// This class creates byte arrays to simulate data.
type Data(size) =
let _data = Array.zeroCreate<byte> (size * 1024)
// Simple property.
member _.Name =
string size
type Cache(count) =
// Dictionary to contain the cache.
static let mutable _cache = Dictionary<int, WeakReference>()
// Track the number of times an object is regenerated.
let mutable regenCount = 0
_cache <- Dictionary<int, WeakReference>()
// Add objects with a short weak reference to the cache.
for i = 0 to count - 1 do
_cache.Add(i, WeakReference(Data i, false))
// Number of items in the cache.
member _.Count =
_cache.Count
// Number of times an object needs to be regenerated.
member _.RegenerationCount =
regenCount
// Retrieve a data object from the cache.
member _.Item
with get (index) =
match _cache[index].Target with
| :? Data as d->
// Object was obtained with the weak reference.
printfn $"Regenerate object at {index}: No"
| _ ->
// If the object was reclaimed, generate a new one.
printfn $"Regenerate object at {index}: Yes"
let d = Data index
_cache[index].Target <- d
regenCount <- regenCount + 1
// Create the cache.
let cacheSize = 50
let r = Random()
let c = Cache cacheSize
let mutable dataName = ""
GC.Collect 0
// Randomly access objects in the cache.
for _ = 0 to c.Count - 1 do
let index = r.Next c.Count
// Access the object by getting a property value.
dataName <- c[index].Name
// Show results.
let regenPercent = double c.RegenerationCount / double c.Count
printfn $"Cache size: {c.Count}, Regenerated: {regenPercent:P2}%%"
// 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%
Imports System.Collections.Generic
Public Class Example
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 = ""
GC.Collect(0)
' Randomly access objects in the cache.
For ctr As Integer = 0 To C.Count - 1
Dim index As Integer = r.Next(c.Count)
' Access the object by getting a property value.
DataName = c(index).Name
' Show results.
Dim regenPercent As Double = c.RegenerationCount * 100 / c.Count
Console.WriteLine("Cache size: {0}, Regenerated: {1}%", c.Count, regenPercent)
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)
_cache = New Dictionary(Of Integer, WeakReference)
' Add data objects with a short weak reference to the cache.
For ctr = 0 To count - 1
_cache.Add(ctr, New WeakReference(New Data(ctr)))
End Sub
' Number of items in the cache.
Public ReadOnly Property Count() As Integer
Return _cache.Count
End Get
End Property
' Number of times an object needs to be regenerated.
Public ReadOnly Property RegenerationCount() As Integer
Return regenCount
End Get
End Property
' Retrieve a data object from the cache.
Default Public ReadOnly Property Item(ByVal index As Integer) As Data
Dim d As Data = TryCast(_cache(index).Target, Data)
' If the object was reclaimed, generate a new one.
If d Is Nothing Then
Console.WriteLine("Regenerate object at {0}: Yes", index)
d = New Data(index)
_cache(index).Target = d
regenCount += 1
' 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)
_data = New Byte(((size * 1024)) - 1) {}
_name = size.ToString
End Sub
' Simple property for accessing the object.
Public ReadOnly Property Name() As String
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%
弱参照を使用すると、ガベージ コレクターはオブジェクトを収集しながら、アプリケーションがオブジェクトにアクセスできるようになります。 オブジェクトが必要な場合でも、そのオブジェクトへの強力な参照を取得し、収集されないようにすることができます。 短い弱参照と長い弱参照の使用方法の詳細については、「弱参照」
を参照してください
。