2012-08-15 33 views
3

在.Net 2.0中工作,将代码基地快速移动到4.0将代理传递给静态类会导致泄漏吗?

最近,我一直在使用事件序列化类,字段:NonSerializable]现在停止这个)。

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

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

+0

鉴于LINQ建立在扩展方法的基础之上,它是静态方法的语法糖,如果使用LINQ的话,你认为这对任何人来说都不是一个大规模的问题吗? – 2012-08-15 06:49:59

回答

5

不,不用担心。将委托传递给方法没有问题,(除非该方法无限期地将委托存储在某个地方)。

什么问题,虽然是静态事件(或长寿命对象上的事件,如单身人士)。如果您不取消订阅这些内容,那么该事件可以让对象永远存在。例如:

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

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

现在MyUtility静态情况下防止新SomeType例如,从收集,直到该事件订阅被删除......它可能永远不会是,因为它是一个匿名方法(这需要巫术退订)。

+0

感谢Marc,进一步思考,我猜想,一旦包含委托的堆栈框架弹出堆栈,就无法将调用对象根植到静态对象上。无论如何,感谢您的确认。有一个upvote和一个勾号。 – johnc 2012-08-15 07:23:35

+0

@johnc事实上,在大多数情况下,它是* stack *,它有参考,它是暂态的。只有当引用被放到某个以前没有收集过的东西时(如:静态/单例事件),它才会成为问题。 – 2012-08-15 07:25:11

3

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