英語で読む

次の方法で共有


WeakReference クラス

定義

"弱い参照" を表します。弱い参照は、オブジェクトがガベージ コレクションによるクリアの対象になっている状態のままで、そのオブジェクトを参照します。

C#
public class WeakReference
C#
public class WeakReference : System.Runtime.Serialization.ISerializable
C#
[System.Serializable]
public class WeakReference : System.Runtime.Serialization.ISerializable
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class WeakReference : System.Runtime.Serialization.ISerializable
継承
WeakReference
属性
実装

次の例では、弱い参照を使用して、アプリケーションのリソースとしてオブジェクトのキャッシュを維持する方法を示します。 キャッシュは、インデックス値によってキー付けされたオブジェクトを使用してIDictionary<TKey,TValue>WeakReference構築されます。 オブジェクトのWeakReferenceプロパティはTarget、データを表すバイト配列内のオブジェクトです。

この例では、キャッシュ内のオブジェクトにランダムにアクセスします。 オブジェクトがガベージ コレクション用に再利用されると、新しいデータ オブジェクトが再生成されます。それ以外の場合は、弱い参照のためにオブジェクトにアクセスできます。

C#
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%

注釈

弱参照を使用すると、ガベージ コレクターはオブジェクトを収集しながら、アプリケーションがオブジェクトにアクセスできるようになります。 オブジェクトが必要な場合でも、そのオブジェクトへの強力な参照を取得し、収集されないようにすることができます。 短い弱参照と長い弱参照の使用方法の詳細については、「弱参照」 を参照してください

コンストラクター

WeakReference()
WeakReference(Object)

指定したオブジェクトを参照する、WeakReference クラスの新しいインスタンスを初期化します。

WeakReference(Object, Boolean)

指定したオブジェクトを参照し、指定した再生処理追跡を使用する WeakReference クラスの新しいインスタンスを初期化します。

WeakReference(SerializationInfo, StreamingContext)

指定したシリアル化およびストリーム オブジェクトからの逆シリアル化されたデータを使用して、WeakReference クラスの新しいインスタンスを初期化します。

プロパティ

IsAlive

現在の WeakReference オブジェクトが参照するオブジェクトが、ガベージ コレクションで収集されているかどうかを示す値を取得します。

Target

現在の WeakReference オブジェクトが参照するオブジェクト (ターゲット) を取得または設定します。

TrackResurrection

現在の WeakReference オブジェクトが参照しているオブジェクトを、ファイナライズ後も追跡するかどうかを示す値を取得します。

メソッド

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
Finalize()

現在の WeakReference オブジェクトが表すターゲットへの参照を破棄します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetObjectData(SerializationInfo, StreamingContext)

SerializationInfo オブジェクトに、現在の WeakReference オブジェクトをシリアル化するために必要なすべてのデータを格納します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在のオブジェクトを表す文字列を返します。

(継承元 Object)

適用対象

製品 バージョン
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

こちらもご覧ください