2012-04-05 12 views
5

SupongamosC# eventos: cómo las variables se accede

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Program p = new Program(); 
     A a = new A(); 
     p.Do(a); 
     System.Threading.Thread.Sleep(1000); 
     a.Fire(); 
    } 

    public void Do(A a) 
    { 
     int i = 5; 
     a.ChangeViewEvent +=() => 
     { 
      Console.WriteLine(i); 
     }; 
    } 
} 

public class A 
{ 
    public delegate void ChangeView(); 
    public event ChangeView ChangeViewEvent; 

    public void Fire() 
    { 
     if(ChangeViewEvent != null) 
      ChangeViewEvent(); 
    } 
} 

¿Por qué cuando se dispara ChangeViewEvent, controlador de eventos es todavía capaz de acceder a la variable de i? Quiero decir, ¿no debería estar fuera de alcance o algo así?

+0

pregunta muy buena, de hecho! :) – Dhananjay

Respuesta

6

¿Cómo es que cuando se activa ChangeViewEvent, el controlador de eventos todavía puede acceder a la variable i? Quiero decir, ¿no debería estar fuera de alcance o algo así?

No, está capturado por la expresión lambda. Se "eleva" a una clase generada por el compilador para que siga siendo accesible para la expresión lambda incluso cuando está "fuera del alcance". (Recuerde, "fuera del ámbito" solo significa "no accesible por su simple nombre". No significa que el espacio de almacenamiento asociado con esa variable se haya ido y no esté accesible para nadie más).

Por cierto, esto es uno razón por la cual la falsedad muchas veces repetida de que "los tipos de valores viven en la pila" es falsa. En este caso, tiene un tipo de valor que en realidad se eleva a una clase generada por el compilador y termina viviendo en el montón.

Para más información sobre este tema, vea MSDN.

+0

excelente respuesta! – Dhananjay

Cuestiones relacionadas