Supposons que nous avons un tel code:
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);
}
}
Ici, action1
et action2
ont complètement séparé de l'ensemble de la capture de variables - rCopy
a été créé spécialement pour cela. Encore, le compilateur génère une seule classe à la capture tout (vérifié généré IL). Je suppose que c'est fait pour des raisons d'optimisation, mais c'est très dur à l'endroit de fuite de mémoire bugs: si a
et b
capturées en classe unique, GC est pas en mesure de recueillir à la fois, au moins, aussi longtemps qu' aucune des lambdas sont référencés.
Est-il un moyen de convaincre compilateur pour produire deux différents capture des classes? Ni aucune raison pourquoi il ne peut être fait?