domingo, 16 de diciembre de 2012

funciones Lazy en c#, o ejecución de funciones perezosas


En alguna ocasión puede que os haga falta definir una llamada a una función, y ejecutarla en otro momento de la aplicación. (Cachés, funciones con muchos bucles,  etc.)

En .NET 4.0, la clase Lazy permite hacer esto.
Según el MSDN,  se utiliza una instancia de Lazy<T> para diferir la creación de un objeto grande o con uso intensivo de recursos, o la ejecución de una tarea con uso intensivo de recursos, especialmente cuando puede que no se produzca esa creación o ejecución durante la duración del programa.

Veamos un ejemplo , que es donde mejor se ve.

        static void Main(string[] args)
        {
            Lazy<int> fn= new Lazy<int>(()=>Sumar(3,4));
            Console.WriteLine("Función definida, pero no ejecutada");
            Console.WriteLine("Valor creado: "+ fn.IsValueCreated);
            Console.WriteLine("Valor: "+ fn.Value);
            Console.WriteLine("Valor creado: "fn.IsValueCreated);
        }

        public static int Sumar(int a, int b)
        {
            return a + b;
        }

 Definimos fn como una llamada a Sumar (3, 4) , pero no se procesa hasta que no se llame a fn.value.

Si copiáis el código en el VS y depuráis, lo veréis mejor.

Saludos.