在c/.net中,在弱引用指向的对象被破坏之前,是否有任何方法可以获得通知?基本上,我想允许收集一个对象,但是在对象被销毁之前做点什么,而不修改代码来添加析构函数(因为我不知道用我的代码到底会起诉什么类型的对象)。
谢谢,
罗伯特
最佳答案
.NET 4.0提供了您需要的解决方案:ConditionalWeakTable。这里有一个简短的程序来演示这个想法。(也讨论了here)
using System;
using System.Runtime.CompilerServices;
namespace GCCollectNotification
{
class ObjectToWatch { }
class Notifier
{
public object ObjectToWatch { get; set; }
~Notifier() { Console.WriteLine("object is collected"); }
}
class Program
{
private ConditionalWeakTable<object, Notifier> map
= new ConditionalWeakTable<object, Notifier>();
public void Test()
{
var obj = new ObjectToWatch();
var notifier = map.GetOrCreateValue(obj);
notifier.ObjectToWatch = obj;
}
static void Main(string[] args)
{
new Program().Test();
GC.Collect();
GC.WaitForPendingFinalizers();
// "object is collected" should have been printed by now
Console.WriteLine("end of program");
}
}
}