¿Qué son los eventos en C#?
Primero, echemos un vistazo a los beneficios de la programación de eventos.
En el pasado, a menudo usábamos un mecanismo de espera al escribir este tipo de programas. Para esperar a que suceda algo, es necesario probar constantemente ciertas variables de juicio, y la introducción de la programación de eventos lo ha simplificado enormemente. proceso:
p>
- Usando eventos puedes determinar fácilmente el orden de ejecución de tu programa.
- Cuando un controlador de eventos espera eventos, no utiliza muchos recursos. La mayor diferencia entre los programas controlados por eventos y los programas de procedimientos es que el programa no verifica constantemente el dispositivo de entrada, sino que espera silenciosamente la llegada de los mensajes. Cada mensaje entrante se colocará en la cola y esperará a que el programa lo procese. Si no hay ningún mensaje en espera, el programa devuelve el control al sistema operativo y ejecuta otro programa.
- Los eventos simplifican la programación. El sistema operativo simplemente entrega el mensaje al objeto y el controlador de eventos del objeto decide cómo manejar el evento. El sistema operativo no necesita conocer el funcionamiento interno del programa, sólo necesita saber cómo hablar con el objeto, es decir, cómo entregar mensajes.
Dado que existen tantos beneficios, nos parece necesario dominarlo. Como dice el refrán: "Si es difícil, no es difícil; si es difícil, no es difícil". Empecemos paso a paso...
Para hablar de actividades, es inevitable hablar de delegados. La relación entre ellos se puede explicar con una simple analogía, pero esta analogía puede no ser apropiada. Por ejemplo, si desea alquilar una casa, esto es un evento, entonces el cliente es la agencia de alquiler de casas. Cuando notifique a la agencia que está alquilando una casa, la agencia generará un plan de alquiler de casas que cumpla con sus requisitos. Luego el agente ejecuta el plan y usted alquila la casa, lo que significa que el incidente está solucionado. Por supuesto, también se puede acudir directamente al arrendador sin pasar por intermediarios, pero sin herramientas como Internet, ¿cómo se puede obtener información sobre quién alquila una casa? Lejos del tema.
Delegados
Los delegados pueden considerarse punteros a funciones, excepto que están orientados a objetos y son seguros para tipos. Para obtener más información sobre cómo comprender a los delegados, consulte mi otro artículo, Una comprensión personal de los delegados en C#.
Eventos
Podemos dividir la programación de eventos en dos partes simples: la clase que genera el evento (escrita como generador de eventos) y la clase que recibe y procesa el evento. Una clase generadora de eventos es una clase que desencadena un evento, pero la clase no sabe qué objeto o método recibirá y manejará el evento que desencadena. Sólo se necesita un medio entre el emisor y el receptor. En .NET Framework, este medio es un delegado. En la clase que recibe y maneja eventos, necesitamos tener un método para manejar los eventos. Bien, implementemos un programa que capture las teclas del teclado en este orden para explicar paso a paso cómo escribir una aplicación de eventos.
1. Primero crea tu propia clase EventArgs.
Cita de MSDN:
EventArgs es la clase base para las clases que contienen datos de eventos. Esta clase no contiene datos de eventos y se usa para eventos que no pasan información de estado al controlador de eventos cuando ocurre el evento. Si el controlador de eventos requiere información de estado, la aplicación debe derivar una clase de esta clase para contener los datos.
Dado que queremos incluir información clave en los eventos de teclas del teclado, necesitamos derivar una clase KeyEventArgs para guardar la información clave para que luego podamos saber qué tecla se presionó.
Clase interna KeyEventArgs: eventArgs
{
char keyChar privado;
KeyEventArgs público( char keyChar ): base() p>
{<
this.keyChar = keyChar;
}
carácter público KeyChar
{
obtener
{
devolver claveChar;
}
}
}
}}
2.
2. Cree otra clase de generación de eventos KeyInputMonitor para monitorear la entrada de teclas del teclado y activar eventos:
Clase interna KeyInputMonitor
{
// Crea un delegado con un tipo de retorno void y dos parámetros
public delegado void KeyDown( object sender, KeyEventArgs e ); p>
// Asocia el delegado creado con un evento específico, en este caso OnKeyDown
public event KeyDown OnKeyDown;
public void Run()
{
bool terminado = false;
hacer
{
Console.WriteLine( "Ingrese un carácter" ); p>
respuesta de cadena = Console.ReadLine();
char respuestaChar = ( respuesta == " " ) ?' : char.ToUpper( respuesta[0] );
p>
cambiar (respuestaChar)
{
caso 'X':
terminado = verdadero;
romper ;
predeterminado:
// Parámetros para obtener información clave
KeyEventArgs keyEventArgs = new KeyEventArgs( ResponseChar );
// Activar evento
OnKeyDown( this, keyEventArgs );
break;
}
} while( ! terminado );
}
}
Observe que la frase OnKeyDown( this, KeyEventArgs );; es la declaración que desencadena el evento y entrega el evento a el delegado KeyDown. Esta es la declaración que desencadena el evento y asigna el evento al delegado KeyDown, que especifica el controlador de eventos que maneja el evento, que está relacionado con la clase que recibe el evento. El parámetro es el objeto que desencadenó el evento y keyEventArgs contiene la información clave.
3. Finalmente, cree una clase de receptor de eventos, que primero genera una instancia delegada y luego agrega esta instancia delegada al objeto de evento para generar una lista de eventos. Luego proporcione un método para mostrar información clave.
clase interna EventReceiver
{
public EventReceiver( KeyInputMonitor monitor )
{
// Generar un Delegue la instancia y agréguela a la lista de eventos generados por KeyInputMonitor
monitor.OnKeyDown += new KeyInputMonitor.KeyDown( this.Echo );
}
private void Echo(remitente del objeto, KeyEventArgs e)
{
// La función del controlador de eventos real
Console.WriteLine( "Clave de captura: {0 }", e. KeyChar );
// La función de controlador de eventos real. KeyChar );
}
}
4. Vea cómo llamar a
la clase pública MainEntryPoint
{
public static void Start()
{
// Crear una instancia de un remitente de eventos
KeyInputMonitor monitor = new KeyInputMonitor();
// Crear una instancia de un receptor de eventos
EventReceiver eventReceiver = new EventReceiver( monitor );
// Ejecutar
monitor.Run() ;<
}
}
Resumen:
Pasos necesarios para usar eventos en C#:
1 .Crear un delegado (delegado)
2. Asocie el delegado creado con un evento específico (hay muchos eventos personalizados en la biblioteca de clases .Net, por lo que también tienen delegados correspondientes y escribe el controlador de eventos asociado). )--Hay muchos eventos personalizados en la biblioteca de clases .Net, por lo que también tienen delegados correspondientes y se usan al escribir controladores de eventos asociados; es decir, cuando ocurre un evento, el método a ejecutar debe tener el mismo firma como delegado)
3. Escriba un controlador de eventos
4. Escriba un controlador de eventos
4.
5. Agregue la instancia delegada a la lista de eventos del objeto de evento generado. Este proceso también se llama suscripción al evento.
Generado e implementado en C# El proceso del evento:
1. Defina A como la instancia que genera el evento y defina a como el evento generado por A
2. Defina B como la instancia que recibe el evento y defina b. Método para manejar eventos
3. Debido a razones del usuario (escritor del programa o usuario del programa) o del sistema (por ejemplo, hacer clic en el botón A genera un evento Click), A genera un evento
4.A Notificar a B de este evento a través del objeto delegado en la lista de eventos
5.B Recibir una notificación de evento (por ejemplo, hacer clic en el botón A genera un evento Click)
6. B recibe la notificación del evento (en realidad, B.b usa un delegado para recibir el evento)
6. Llame al método B.b para completar el procesamiento del evento
7. p>