Eventos y delegados
Un evento es un mensaje que envía un objeto cuando ocurre una acción. La acción puede estar causada por la interacción del usuario, como un clic, o por otra lógica del programa. El objeto que provoca el evento se conoce como remitente del evento. El objeto que captura el evento y responde a él se denomina receptor del evento.
En las comunicaciones de eventos, el remitente del evento no sabe qué objeto o método recibirá los eventos que provoca. Se necesita un intermediario (o mecanismo de tipo puntero) entre el origen y el receptor. .NET Framework define un tipo especial (Delegate) que proporciona la funcionalidad de un puntero a función.
Un delegado es una clase que puede guardar una referencia a un método. A diferencia de otras clases, una clase de delegado tiene un prototipo y puede guardar referencias únicamente a los métodos que coinciden con su prototipo. Por lo tanto, un delegado equivale a un puntero a función con seguridad o a una devolución de llamada. Aunque los delegados tienen otros usos, esta explicación se centra en la funcionalidad de control de eventos de los delegados. Una declaración de delegado es suficiente para definir una clase de delegado. La declaración proporciona el prototipo del delegado y Common Language Runtime proporciona la implementación. En el siguiente ejemplo se muestra la declaración de un delegado de eventos.
Public Delegate Sub AlarmEventHandler(sender As Object, e As AlarmEventArgs)
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public delegate void AlarmEventHandler(Object^ sender, AlarmEventArgs^ e);
La sintaxis es similar a la de la declaración de un método; no obstante, la palabra clave delegate indica al compilador que AlarmEventHandler es un tipo de delegado. Por convención, los delegados de evento de .NET Framework tienen dos parámetros, el origen que provocó el evento y los datos del evento.
Una instancia del delegado AlarmEventHandler puede enlazarse a cualquier método que coincida con su prototipo, como el método AlarmRang de la clase WakeMeUp, como se muestra en el siguiente ejemplo.
Public Class WakeMeUp
' AlarmRang has the same signature as AlarmEventHandler.
Public Sub AlarmRang(sender As Object, e As AlarmEventArgs)
'...
End Sub
'...
End Class
public class WakeMeUp
{
// AlarmRang has the same signature as AlarmEventHandler.
public void AlarmRang(object sender, AlarmEventArgs e)
{
//...
}
//...
}
public ref class WakeMeUp
{
public:
// AlarmRang has the same signature as AlarmEventHandler.
void AlarmRang(Object^ sender, AlarmEventArgs^ e)
{
//...
}
//...
};
Los delegados de evento personalizados sólo son necesarios cuando un evento genera datos de evento. Muchos eventos, incluidos algunos eventos de interfaz de usuario, como los clics, no generan datos de evento. En estos casos, es apropiado el delegado proporcionado en la biblioteca de clases para el evento sin datos, System.EventHandler. A continuación se muestra su declaración.
Delegate Sub EventHandler(sender As Object, e As EventArgs)
delegate void EventHandler(object sender, EventArgs e);
delegate void EventtHandler(Object^ sender, EventArgs^ e);
Los delegados de evento son de multidifusión, lo que significa que pueden guardar referencias a más de un método de control de eventos. Para obtener información detallada, vea Delegate. Los delegados permiten realizar un control de eventos más flexible y detallado. Un delegado actúa como remitente de eventos de la clase que provoca el evento y mantiene una lista de los controladores registrados para el evento.
Para obtener más información sobre cómo usar delegados para incluir funcionalidad de eventos en un componente o control, vea Provocar un evento.
Para obtener información general sobre cómo consumir eventos en sus aplicaciones, vea Consumir eventos.
Vea también
Tareas
Cómo: Provocar y utilizar eventos
Cómo: Conectar métodos controlador de eventos a eventos