添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
阳刚的青蛙  ·  onstat -g sql ...·  3 天前    · 
愉快的双杠  ·  mysql视图查询优化-掘金·  1 年前    · 

このブラウザーはサポートされなくなりました。

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%

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