Un delegate es un objeto que representa una referencia a un método que usualmente tiene una lista de parámetros y también un tipo de dato de retorno.
En otras palabras un Delegate es una variable que contiene una referencia a un método en C#.
¿Qué son los Delegates Func y Action?
Los Func y Action delegates son poderosas herramientas usadas para crear y trabajar métodos en C# de una manera ágil y dinámica, sobre todo cuando nuestro código se orienta a una programación funcional.
Pueden ser usados tanto para enviar parámetros a un método o también para retornar valores.
¿Cuál es la diferencia entre Func y Action?
Principalmente radica en el retorno de valores, veamos:
El Func Delegate te permite retornar un específico tipo de dato.
El Action Delegate no retorna ningún tipo de valor.
En ambos casos, sea Func o Action, como máximo puedes enviar 16 parámetros.
Cómo usar un Func Delegate?
Creamos un Func Delegate con esta sintaxis genérica:
Veamos un ejemplo en código:
En el ejemplo estamos creando un Func Delegate que tiene dos parámetros de tipo int y está retornando también un valor de tipo int.
Asignamos una expresión lambda al delegate, que se encarga de realizar la operación de suma y retornar el valor correspondiente.
¿Cómo usar un Action Delegate?
Veamos la sintaxis genérica de un Action Delegate:
Ahora veamos un ejemplo:
En este ejemplo definimos un Action Delegate que tiene como parámetro un valor string, asignamos una expresión lambda al delegate que se encarga de imprimir en consola un mensaje de bienvenida, incluyendo el nombre parámetro que ingresa al action.
Y Los Predicates Delegates?:
Son un tipo especial de Delegate, en este caso solo devuelve un valor booleano y solo acepta un solo parámetro.
Cuando usar Delegates:
Callbacks: Func y Action Delegates son frecuentemente usados para implementar callbacks, donde un método puede ser enviado como parámetro de otro método.
Linq: Son comúnmente usados en las consultas de tipo LINQ para definir predicados o transformación de valores y funciones.
Programación Asíncrona: Los Action Delegates son muy útiles para definir y ejecutar operaciones asíncronas como invocar una API externa o actualizar un componente remoto.
Dependency Injection: Func Delegates pueden ser usados para crear Factory Methods y resolver dinámicamente los tipos de datos durante el proceso de Dependency Injection.
Aquí te presento una imagen donde hacemos algunos ejemplos sobre una collection de elementos usando LINQ y Delegates de tipo Func, Action y Predicate: