在 .Net 2.0 中工作,很快将代码库迁移到 4.0
最近我一直在使用事件序列化类,并且找到我的事件订阅者(即表单)也会尝试序列化(我现在使用 [field:NonSerializable] 来阻止这种情况)。
这让我想到,如果我将委托传递给静态类的方法(仅用于方法范围),静态类是否根植于委托的所有者,导致它无法被 GC 收集?
我有一个静态 ListUtilities 类来处理 lambda 表达式以及静态缓存,我定期传递委托,并且想知道这是否会泄漏内存?
在 .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
实例,直到该事件订阅被删除......它可能永远不会,因为它是一个匿名方法(需要巫术来取消订阅)。
这不会导致内存泄漏。只要您不将委托引用保存在静态变量中,那么在方法完成后就可以收集委托所有者。