我有以下情况。
A List<WeakReference<MyClass>>
,MyClass
有一个名为 的事件MyEvent
。我遍历列表,并且对于每个活着的引用,我可能会调用MyEvent
它的目标。
在我的代码的其他部分,我保留了对这些对象的实时引用。假设该过程如下所示:
var list = new List<WeakReference<MyClass>>();
var a = new MyClass();
a.MyEvent += delegate {
DoSomeStuff(a);
};
list.Add(new WeakReference<MyClass>(a));
现在假设我不再使用a
,并决定将其处理掉。所以现在,a = null
.
我有一个定期检查设置来清除死引用的原始列表。我想知道的是,我连接的这个事件处理程序是否会保持以前a
的活动实例,MyClass
进而阻止我从列表中清理它?
如果事件不仅仅是一个普通Action
的,而是一个Action<MyClass>
将自身作为参数传递给处理程序的事件怎么办?在某种程度上,该处理程序仍然具有对原始对象的引用,即使该处理程序可能永远不会被调用。
这可能真的很明显,我可以想到类似的情况,我知道答案,但是我将这个函数挂在对象上的事实让我怀疑。如果它确实让它活着,它会破坏我的整个系统,所以我需要知道。