假设我们有这样的代码:
public class Observer
{
public event EventHandler X = delegate { };
}
public class Receiver
{
public void Method(object o) {}
}
public class Program
{
public static void DoSomething(object a, object b, Observer observer, Receiver r)
{
var rCopy = r;
EventHandler action1 = (s, e) => rCopy.Method(a);
EventHandler action2 = (s, e) => r.Method(b);
observer.X += action1;
observer.X += action2;
}
public static void Main(string[] args)
{
var observer = new Observer();
var receiver = new Receiver();
DoSomething(new object(), new object(), observer, receiver);
}
}
这里action1
并action2
有完全分离的一组捕获变量 -rCopy
是专门为此创建的。尽管如此,编译器只生成一个类来捕获所有内容(检查生成的 IL)。我想这样做是出于优化的原因,但它允许非常难以发现的内存泄漏错误:如果a
并b
在单个类中捕获,则至少只要引用了任何lambda,GC 就无法收集两者。
有没有办法说服编译器生成两个不同的捕获类?或者有什么理由不能完成?