miércoles, 16 de diciembre de 2015

C# delegate, closure

Pensando en algo más complejo, por ejemplo cuando la función lambda hace referencia a variables declaradas fuera de la expresión lambda (o para la referencia this). Normalmente, cuando dejas al alcance de una variable, la variable no es valida. ¿Pero que si un delegado se refiere a una variable local y esta regresa después quien llamo al método? Ahora el delegado tiene una variable de larga vida. El compilador genera código que hace la vida de la variable sea más larga que la vida del delegado esto es llamado closure (cierre).

using System;

namespace UsandoDelegadoAction
{
    class Program
    {
        static void Main(string[] args)
        {
            int myVar = 100;

            Console.WriteLine("myVar antes de llamar a delegado {0}", myVar);

            Action<int, int> calc = (x, y) =>
            {
                //int myVar = 10;

                myVar += (x + y);
                Console.WriteLine("Llamada desde el delegado {0}", myVar);
            };

            calc(3, 4);
            Console.WriteLine("Despues de llamar al delegado {0}", myVar);
        }
    }
}




Si se intenta crear una variable local del mismo nombre a la variable externa, la ayuda inteligente de Visual Studio avisa que no se puede usar, como se ve en la siguiente imagen.



Reference:
Exam Ref. 70-483 Proramming in C#

No hay comentarios.:

Publicar un comentario