Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 posibilidad de ordenar una lista de estrellas en una aplicación de astronomía. Usted puede optar por ordenar esas estrellas por su distancia desde la tierra, o la magnitud de la estrella, o su brillo percibido.
En todos esos casos, el método Sort() hace esencialmente lo mismo: organiza los elementos de la lista en función de alguna comparación. El código que compara dos estrellas es diferente para cada una de las ordenaciones.
Estos tipos de soluciones se han utilizado en software durante 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 escribe para algoritmos como este tiene seguridad de tipos. El compilador garantiza que los tipos coincidan para los tipos de argumento y tipos de retorno.
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 delegado. Mediante punteros de función, puede especificar diferentes convenciones.
Objetivos de diseño de lenguaje para delegados
Los diseñadores de lenguaje enumeraron varios objetivos para la característica que se acabó convirtiendo en los delegados.
El equipo quería una construcción de lenguaje común que pudiera ser utilizada para cualquier algoritmo de enlace tardío. Los delegados permiten a los desarrolladores aprender un concepto y usar ese mismo concepto 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 asegurarse de que el código de los delegados podía proporcionar la base para el patrón de eventos de .NET.
El resultado de todo ese trabajo fue el soporte de delegados y eventos en C# y .NET.
En los artículos restantes de esta serie se tratarán las características del lenguaje, la compatibilidad con bibliotecas y las expresiones comunes que se usan al trabajar con delegados y eventos. Obtendrá información sobre:
- La
delegate
palabra clave y el código que genera. - Las características de la
System.Delegate
clase y cómo se usan esas características. - Cómo crear delegados con seguridad de tipos.
- Cómo crear métodos que se pueden invocar a través de delegados.
- Cómo trabajar con delegados y eventos mediante expresiones lambda.
- Cómo los delegados se convierten en uno de los bloques fundamentales de LINQ.
- Cómo los delegados son la base para el patrón de eventos de .NET y cómo son diferentes.
Comencemos.