利用ConditionalWeakTable<TKey, TValue>使编译器可以将对象字段动态附加到托管对象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.CompilerServices;
namespace ConsoleApp8
{
class Program
{
static void Main(string[] args)
{
var key1 = new Key("key1");
var key2 = new Key("key2");
var key3 = new Key("key3");
//利用ConditionalWeakTable为对象附加字段,而不影响GC
var weakTable = new ConditionalWeakTable<Key, Value>();
weakTable.Add(key1, new Value());
weakTable.Add(key2, new Value());
weakTable.Add(key3, new Value());
var weak2 = new WeakReference(key2);
key2 = null;
key3 = null;
GC.Collect();
//当key被回收后,weakTable中对应的k-v也会自动移除
Console.WriteLine($@"key1={key1?.ToString()??"null"}");
Console.WriteLine($@"key2={key2?.ToString()??"null"}");
Console.WriteLine($@"key3={key3?.ToString()??"null"}");
Console.ReadLine();
}
public class Key {
private readonly string _name;
public Key(string name) => _name = name;
public override string ToString() => _name;
}
public class Value {
public DateTime CreationTime = DateTime.Now;
public override string ToString() => CreationTime.ToShortTimeString();
}
}
}
运行测试