Introducción a delegados y eventos en C#
Los delegados proporcionan un mecanismo de enlace en tiempo de ejecución en .NET. Un enlace en tiempo de ejecución significa que se crea un algoritmo en el que el llamador también proporciona al menos un método que implementa parte del algoritmo.
Por ejemplo, considere la ordenación de una lista de estrellas en una aplicación de astronomía. Puede decidir ordenar las estrellas por su distancia con respecto a la Tierra, por la magnitud de la estrella o por su brillo percibido.
En todos estos casos, el método Sort() hace básicamente lo mismo: organiza los elementos en la lista en función de una comparación. El código que compara dos estrellas es diferente para cada uno de los criterios de ordenación.
Este tipo de soluciones se ha usado en software durante aproximadamente medio siglo. El concepto de delegado del lenguaje C# proporciona compatibilidad con el lenguaje de primera clase y seguridad de tipos en torno a este concepto.
Como verá más adelante en esta serie, el código de C# que escriba para algoritmos como este tiene seguridad de tipos. El compilador garantiza que los tipos coincidan con los argumentos y los tipos de valor devuelto.
punteros de función admiten escenarios similares, donde necesita más control sobre la convención de llamada. El código asociado a un delegado se invoca mediante un método virtual agregado a un tipo de delegado. Mediante los punteros de función puede especificar otras convenciones.
Objetivos del diseño de lenguaje para los delegados
Los diseñadores de lenguaje enumeraron varios objetivos para la característica que se acabó convirtiendo en los delegados.
El equipo aspiraba a crear una construcción de lenguaje común que pudiera usarse para cualquier algoritmo de enlace en tiempo de ejecución. Los delegados permiten a los desarrolladores aprender un concepto y usarlo en muchos problemas de software diferentes.
En segundo lugar, el equipo quería que se admitiesen llamadas a métodos únicos y multidifusión. (Los delegados de multidifusión son delegados que encadenan varias llamadas de método. Verá ejemplos más adelante en esta serie).
El equipo quería que los delegados admitiesen la misma seguridad de tipos que los desarrolladores esperan de todas las construcciones C#.
Por último, el equipo reconocía que un patrón de eventos es un patrón específico en el que los delegados, o cualquier algoritmo de enlace en tiempo de ejecución, resultan útiles. El equipo quería garantizar que el código de los delegados proporcionase una base para el patrón de eventos de .NET.
El resultado de todo ese trabajo fue la compatibilidad con los delegados y los eventos en C# y .NET.
Los artículos restantes de esta serie tratarán sobre las características del lenguaje, la compatibilidad con bibliotecas y las expresiones comunes que se usan al trabajar con los delegados y eventos. Obtendrá información sobre:
- La palabra clave
delegate
y el código que genera. - Las características de la clase
System.Delegate
y la manera en que se usan estas características. - Cómo crear delegados con seguridad de tipos.
- Cómo crear métodos que se puedan invocar mediante delegados.
- Cómo trabajar con delegados y eventos mediante expresiones lambda.
- Cómo los delegados se convierten en uno de los bloques de creación para LINQ.
- Cómo los delegados son la base del patrón de eventos de .NET y en qué se diferencian.
Comencemos.