2

我有订阅自定义事件的对象,因此我可以一次更改它们。麻烦的是,这永远不会让它们超出范围并被垃圾收集。即使使控件为空也不会使其中包含的控件为空。事实上,即使是无效的控件也不会被收集!(如果我在任何一点上错了,请纠正我。)

所以我想到了一个解决方案,将事件包装在一个类中,创建该类的一个实例并使用它,然后在我想让对象获得 GC 时将其设为空,并创建它的一个新实例接着说。

但是,我对此有两个问题:

  1. 它会真正起作用,还是对象仍然会逃避被 GC 处理?
  2. 有没有更简单、更直接的方法来实现这一点?

编辑:第 2 部分已得到回答(在对答案的评论中)。简单地做:event_name = null;。不过,我仍然想知道关于第 1 部分 - 它会起作用吗?

4

2 回答 2

3

您需要取消订阅您的活动。这就像订阅一样工作,但使用-=运算符而不是+=.

例子:

foo.SomeEvent-= new EventHandler(foo_SomeEvent);
于 2012-12-05T20:10:53.293 回答
0

第 2 部分的答案(根据 Servy 的评论):

event_name = null;
于 2012-12-09T11:37:25.903 回答