Basé sur votre question ici et de ton commentaire de Jon répondre, je pense que vous confondez plusieurs choses. Pour s'assurer qu'elle est claire:
- La méthode qui sauvegarde le délégué pour un lambda est toujours le même.
- La méthode qui sauvegarde le délégué pour "le même" lambda qui apparaît lexicalement deux fois est autorisé à être le même, mais dans la pratique, n'est pas la même chose dans notre mise en œuvre.
- Le délégué de l'instance qui est créé pour un lambda pourrait ou ne pourrait pas toujours être le même, selon la façon intelligente le compilateur est à propos de la mise en cache il.
Donc, si vous avez quelque chose comme:
for(i = 0; i < 10; ++i)
M( ()=>{} )
puis chaque fois que M est appelé, vous obtenez la même instance du délégué parce que le compilateur est intelligent et génère
static void MyAction() {}
static Action DelegateCache = null;
...
for(i = 0; i < 10; ++i)
{
if (C.DelegateCache == null) C.DelegateCache = new Action ( C.MyAction )
M(C.DelegateCache);
}
Si vous avez
for(i = 0; i < 10; ++i)
M( ()=>{this.Bar();} )
ensuite, le compilateur génère
void MyAction() { this.Bar(); }
...
for(i = 0; i < 10; ++i)
{
M(new Action(this.MyAction));
}
Vous obtenez un nouveau délégué à chaque fois, avec la même méthode.
Le compilateur est autorisée (mais en fait non, pas cette fois) de générer des
void MyAction() { this.Bar(); }
Action DelegateCache = null;
...
for(i = 0; i < 10; ++i)
{
if (this.DelegateCache == null) this.DelegateCache = new Action ( this.MyAction )
M(this.DelegateCache);
}
Dans ce cas, vous obtenez toujours la même instance de délégué, si possible, et à tous les délégués seraient garantis par la même méthode.
Si vous avez
Action a1 = ()=>{};
Action a2 = ()=>{};
Ensuite, dans la pratique, le compilateur génère ce que
static void MyAction1() {}
static void MyAction2() {}
static Action ActionCache1 = null;
static Action ActionCache2 = null;
...
if (ActionCache1 == null) ActionCache1 = new Action(MyAction1);
Action a1 = ActionCache1;
if (ActionCache2 == null) ActionCache2 = new Action(MyAction2);
Action a2 = ActionCache2;
Cependant, le compilateur est permis de détecter que les deux lambdas sont identiques et de générer des
static void MyAction1() {}
static Action ActionCache1 = null;
...
if (ActionCache1 == null) ActionCache1 = new Action(MyAction1);
Action a1 = ActionCache1;
Action a2 = ActionCache1;
C'est que maintenant clair?