Las funciones de devolución de llamada son una parte importante de la programación de Windows. Si tiene experiencia en programación en C o C++, habrá utilizado devoluciones de llamada en muchas API de Windows. Después de agregar la palabra clave AddressOf a VB, los desarrolladores y desarrolladores pueden aprovechar las API que alguna vez estuvieron restringidas. Las funciones de devolución de llamada son en realidad punteros a llamadas a métodos, también conocidos como punteros de función, que son una característica de programación muy poderosa. .NET implementa el concepto de punteros de función en forma de delegados. Lo que tienen de especial es que, a diferencia de los punteros de función de C, los delegados de .NET tienen seguridad de tipos. Esto muestra que el puntero de función en C es solo un puntero a una unidad de almacenamiento. No podemos decir a qué apunta realmente este puntero, y mucho menos los parámetros y tipos de retorno. Como se describe en este capítulo, los delegados de .NET funcionan como una operación con seguridad de tipos. A continuación aprenderemos cómo .NET utiliza los delegados como una forma de implementar eventos.
1. Encomienda
Cuando desee pasar un método a otro método, deberá utilizar un delegado. Para entender lo que significan, eche un vistazo al siguiente código:
int i = int.Parse("99");
Estamos acostumbrados a pasar datos como parámetros a métodos, como se muestra en el ejemplo anterior. Entonces, pasar otro método a un método suena un poco extraño. A veces, la operación realizada por un método no se realiza sobre los datos, sino sobre otro método, que es más complicado. No sabemos cuál es el segundo método en tiempo de compilación. Esta información solo se puede obtener en tiempo de ejecución, por lo que debemos pasar el segundo método como parámetro al primer método. Esto suena confuso. Aquí hay algunos ejemplos: Para explicar. :
1. Iniciar subprocesos-----En C#, puede indicarle a la computadora que ejecute ciertas secuencias de ejecución nuevas en paralelo. Esta secuencia se llama subproceso. Utilice el método Start() en una instancia de System.Threading.Thread acumulado para comenzar a ejecutar un subproceso. Si desea indicarle a la computadora que inicie una nueva secuencia de ejecución, debe indicar dónde se ejecutará la secuencia. Se debe proporcionar a la computadora los detalles del método para iniciar la ejecución, es decir, el método Thread.Start() debe tomar un parámetro que defina el método que será llamado por el hilo.
2. Clases de biblioteca generales------Hay muchas bibliotecas que contienen código para realizar diversas tareas estándar. Estas bibliotecas suelen ser autónomas. De esta forma, al escribir la biblioteca, sabrás cómo realizar la tarea. Pero a veces las tareas también contienen subtareas. Sólo el código del cliente que utiliza la biblioteca sabe cómo realizar estas subtareas. Por ejemplo, escriba una clase que tome una serie de objetos y los clasifique en orden ascendente. Sin embargo, parte del proceso de clasificación implica reutilizar dos objetos en la matriz, comparándolos para ver cuál debería aparecer primero. Si estuviera escribiendo una clase que tuviera que poder ordenar cualquier conjunto de objetos, no podría decirle a la computadora de antemano cómo se deberían comparar los objetos. El código de cliente que maneja matrices de objetos en una clase también debe decirle a la clase cómo comparar los objetos que se van a ordenar. En otras palabras, el código del cliente debe pasar ciertos detalles a la clase que hará que esto sea apropiado.
3. Eventos ------ generalmente notifican al código qué eventos han ocurrido. La programación GUI se trata principalmente de manejar eventos. Cuando ocurre un evento, el tiempo de ejecución necesita saber qué método se debe ejecutar. Esto requiere pasar el método que maneja el tiempo como parámetro del delegado. Estos se discutirán más adelante.
Anteriormente establecimos la regla de que los nombres de los métodos a veces se pasan como argumentos a otros métodos. Es necesario indicar a continuación cómo realizar este proceso. La forma más sencilla es pasar el nombre del método como parámetro. Por ejemplo, en el ejemplo del hilo anterior, supongamos que se inicia un nuevo hilo y hay un método llamado EntryPoint(), que es donde el hilo comienza a ejecutarse.
anular el punto de entrada()
{
//haz lo que el nuevo hilo necesite hacer
}
También puedes usar el siguiente código para comenzar a ejecutar un nuevo hilo:
Hilo Nuevo Hilo = nuevo Hilo();
Thread.Start(EntryPoint); //INCORRECTO
De hecho, esta es una forma muy simple, que es la forma utilizada en algunos lenguajes como C y C++ (en C y C++, el parámetro EntryPoint es un puntero de función).
Pero este enfoque directo puede causar algunos problemas, como la seguridad de tipos. Cuando se realiza programación orientada a objetos, los métodos rara vez existen de forma aislada. Por lo general, es necesario asociarlos con una instancia de clase antes de ser llamados. Y este método no tiene en cuenta esta cuestión. Por lo tanto, .NET Framework no permite sintácticamente este enfoque directo. Si desea pasar un método, debe encapsular los detalles del método en un nuevo tipo de objeto, un delegado. Los delegados son solo un tipo especial de objeto. Lo especial es que todos los objetos que definimos antes contienen datos, mientras que los delegados solo contienen los detalles de los métodos.
-