将委托传递给静态类会导致泄漏吗?

时间:2012-08-15 06:39:27

标签: .net memory-leaks static delegates

使用.Net 2.0,很快将代码库移到4.0

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

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

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

2 个答案:

答案 0 :(得分:5)

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

有什么问题,但是静态事件(或长寿命对象上的事件,例如单例)。如果您没有取消订阅,那么事件可以使对象永远保持活力。例如:

// this object is meant to be short-lived
var obj = new SomeType();

// some static event
MyUtility.SomeEvent += { obj.Foo(); };

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

答案 1 :(得分:3)

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