viernes, 22 de noviembre de 2013

Etiquetado como:

Delegados y Expresiones Lambda… perdiendo el miedo

C# y Programación
Artículo para: Desarrolladores .NET con nivel intermedio

Delegados

Antes de empezar a entrar en el detalle sobre este tema indicar que el presente documento no es un libro, por lo que no nos extenderemos mucho. Lo cierto es que suele dar bastante miedo al programador porque son conceptos que no se entienden bien ni con un libro, por lo que trataremos de explicarlo sin que sea excesivamente técnico, ni exhaustivo.

Un delegado es la definición de una función que sirve para pasarla como parámetro a otra. Así de sencillo y claro. Quizá se encuentren otras definiciones mejor redactadas y mucho más confusas, pero esta se entiende tal cual.

public delegate bool DelegateFunction(int parameter1, int parameter2);

Así se declara un delegado, no requiere más que esto y sirve como carcasa para pasar por parámetro a otra función una con este mismo tipo de declaración: dos números enteros de entrada y un booleano de salida.

Ahora viene el crear una función que utilice el delegado como parámetro:

public string ExampleFunctionWithParameterDelegate(DelegateFunction df, int p1, int p2)
{
if (df(p1, p2))
{
return String.Format("Se cumple la condición de la función df usando {0} y {1}",
                    p1,
                    p2);
}
return String.Format("NO se cumple la condición de la función df usando {0} y {1}",
                    p1,
                    p2);
}


Esto nos lleva a empezar a entender cómo funcionan los delegados. Ahora nos bastará con crear funciones que cumplan los parámetros de entrada (dos enteros) y salida (un booleano) como las que siguen:

public bool DelegateExampleFunctionP1IsLessThanP2(int parameter1, int parameter2)
{
return parameter1 < parameter2;
}

public bool DelegateExampleFunctionP1IsMoreThanP2(int parameter1, int parameter2)
{
return parameter1 > parameter2;
}

Bueno, ahora lo hilamos todo realizando llamadas como las que siguen:

var p1 = 5;
var p2 = 2;
var returned1 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsLessThanP2, p1, p2);
var returned2 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsMoreThanP2, p1, p2);


¿Podéis adivinar los valores de las variables returned1 y returned2 después de la ejecución del juego de instrucciones? Pues son los siguientes:

returned1 = "NO se cumple la condición de la función df usando 5 y 2"
returned2 = "Se cumple la condición de la función df usando 5 y 2"

Como podemos observar, esto nos permite hacer funciones mucho más flexibles, incluso “mutantes”. Ahora pasaremos a explicar las expresiones Lambda, utilizando el mismo ejemplo para los delegados.

Expresiones Lambda





Siguiendo la estela anterior y sin más dilación, aporto un ejemplo de expresión Lambda que servirá para comprender a la perfección cómo funcionan, comparándolo con el anterior desarrollo de ejemplo, marcamos en amarillo la expresión lambda:


var returned1 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsLessThanP2, p1, p2);
var lambdaReturned1 = ExampleFunctionWithParameterDelegate(
(parameter1, parameter2) => { return parameter1 < parameter2; }, 
         p1, p2);

var returned2 = ExampleFunctionWithParameterDelegate(
DelegateExampleFunctionP1IsMoreThanP2, p1, p2);
var lambdaReturned2 = ExampleFunctionWithParameterDelegate(
(parameter1, parameter2) => { return parameter1 > parameter2; },
p1, p2);


Se empieza a vislumbrar que la única diferencia con el código anterior de delegados es que ahora ya no necesito las funciones auxiliares creadas, las creo “al vuelo” y sin definición directamente dentro de los parámetros de llamada de la función principal con el delegado.

Como imaginaréis, el resultado será el siguiente, exactamente idéntico a su predecesor ejemplo de delegados:

returned1 = "NO se cumple la condición de la función df usando 5 y 2"
lambdaReturned1 = "NO se cumple la condición de la función df usando 5 y 2"
returned2 = "Se cumple la condición de la función df usando 5 y 2"
lambdaReturned2 = "Se cumple la condición de la función df usando 5 y 2"


Las expresiones lambda y los delegados se encuentran implementados en multitud de funcionalidades de los objetos del framework. Uno de los sitios más usuales donde encontrarlas es en los objetos de la clase System.Collections.Generic , por ejemplo en las listas y nos será de gran utilidad su buen empleo para realizar consultas sobre dichas colecciones.

Enrique Díaz

Author y editor

0 comentarios:

Publicar un comentario

 

Webs amigas:

  • En tu email...

    Suscríbete aquí a nuestro newsletter y nunca más te perderás nuestras actualizaciones

    Copyright © Los vericuetos .NET 2015
    Distributed By My Blogger Themes | Designed By Templateism