将委托传递给静态类是否会导致泄漏



在.Net 2.0中工作,即将将代码库移至4.0

最近我一直在用事件序列化类,并且找到我的事件订阅者(即表单)也会尝试序列化(我现在正在使用 [field:NonSerializable] 来阻止这种情况)。

这让我想到,如果我将委托传递给静态类的方法(仅用于方法范围),静态类是否会根植委托的所有者,导致 GC 无法收集它?

我有一个静态 ListUtilities 类来执行 lambda 表达式以及静态缓存的工作,我经常通过委托,并想知道这是否会泄漏内存?

不,没什么可担心的。将委托传递给方法很好(除非该方法将委托无限期地存储在某个位置)。

但是,有问题的是静态事件(或长期对象上的事件,例如单例)。如果您不取消订阅这些内容,则事件可以使对象永远保持活动状态。例如:

// this object is meant to be short-lived
var obj = new SomeType();
// some static event
MyUtility.SomeEvent += { obj.Foo(); };

现在,MyUtility上的静态事件会阻止收集新的SomeType实例,直到删除该事件订阅...它可能永远不会,因为它是一种匿名方法(需要 Voodoo 才能取消订阅)。

这不会导致内存泄漏。只要不将委托引用保存在静态变量中,就可以在方法完成后收集委托所有者。

最新更新