Академический Документы
Профессиональный Документы
Культура Документы
Delegates y Eventos
Delegates y eventos
Delegates
Un delegate es muy similar a un puntero a funcin de C++, es una estructura de datos
que referencia a un mtodo esttico o a un mtodo de instancia de un objeto.
Existen algunas diferencias:
- Un puntero a funcin de C++ slo puede referenciar funciones estticas.
- Un delegate no slo referencia al punto de entrada del mtodo, sino tambin a la
instancia del objeto al que pertenece el mtodo.
El sentido de los delegates es permitir que un mtodo pueda recibir como parmetro un
puntero a otro mtodo. Es ms, no es necesario conocer en tiempo de compilacin el
mtodo concreto que se pasa como parmetro: puede asignarse en tiempo de ejecucin,
lo cual ofrece una gran flexibilidad a la hora de programar.
El tipo base de todos los delegates es la clase System.Delegate,que quiere decir que un
delegate es una instancia de la clase System.Delegate (o una derivada).
Los delegates no necesitan saber la clase de objeto al cual referencian. Lo que necesitan
saber es la definicin del mtodo al que referencian.
Declaracin de Delegates.
Una declaracin de un delegate define un tipo de referencia que extiende la clase
System.Delegate y que puede utilizarse para encapsular un mtodo con una definicin
determinada..
La sintaxis de la declaracin es:
declaracin-delegate:
atributosopc
modificadores-del-delegateopc
delegate
identificador(lista-parmetros-formalesopc ) ;
modificadores-del-delegate:
modificador-del-delegate
modificadores-del-delegate modificador-del-delegate
modificador-del-delegate:
new
public
protected
internal
private
Por ejemplo:
delegate int MiDelegate();
1/11
tipo-resultado
Delegates y Eventos
class MiClase
{
MiDelegate d = new MiDelegate(Cuadrado);
static float Cuadrado(float x) {
return x * x;
}
static int Cuadrado(int x) {
return x * x;
}
}
Utilizacin de Delegates.
Una instancia de tipo delegate encapsula un mtodo, tambin llamado entidad
invocable. En el caso de mtodos estticos, una entidad invocable consta nicamente
del mtodo. En el caso de mtodos de instancia, una entidad invocable consta de una
instancia de la clase del mtodo y un mtodo de tal instancia.
Un ejemplo de utilizacin de instancias de tipo delegate es:
using System;
// declaracin del delegate
delegate int MiDelegate();
public class MiClase
{
public int MetodoInstancia ()
{
Console.WriteLine("Hola desde el mtodo de instancia.");
return 0;
}
static public int MetodoEstatico ()
{
Console.WriteLine("Hola desde el mtodo esttico.");
return 0;
}
}
public class Aplicacion
{
static void Main (string[] args)
{
MiClase p = new MiClase();
// Asociar el delegate al mtodo de instancia:
MiDelegate d = new MiDelegate(p.MetodoInstancia);
// Invocacin al mtodo de instancia a travs del delegate:
d();
// Asociar el delegate al mtodo esttico:
d = new MiDelegate(MiClase.MetodoEstatico);
// Invocacin al mtodo esttico a travs del delegate:
d();
}
}
2/11
Delegates y Eventos
Figura 8.1
Delegates Multicast.
Un delegate de tipo multicast puede asociarse a ms de un mtodo, de modo que
invocando al delegate una sola vez, todos los mtodos a los que est asociado sean
invocados secuencialmente.
Un delegate referencia realmente una lista de mtodos a la que es posible aadir o quitar
mtodos utilizando los operadores +, +=, - y -=.
Para ilustrar esto puede modificarse el mtodo Main() del ejemplo anterior:
static void Main (string[] args)
{
MiClase p = new MiClase();
// Asociar el delegate al mtodo de instancia:
MiDelegate d = new MiDelegate(p.MetodoInstancia);
// Asociar el delegate al mtodo esttico, se utiliza
//el operador + para que se aada el mtodo esttico
//a la lista de mtodos apuntados por el delegate d:
d += new MiDelegate(MiClase.MetodoEstatico);
// Invocacin
//delegate:
de
ambos
d();
}
3/11
mtodos
travs
del
Delegates y Eventos
Figura 8.2
Existe una clase especfica para este tipo de delegates multicast llamada
System.MulticastDelegate, la cual deriva de System.Delegate y est en el
assembly Mscorlib (Mscorlib.dll).
La clase Delegate soporta una lista de mtodos siempre que todos devuelvan el mismo
tipo de datos, pero en una lista de varios mtodos esto no tiene porqu ser as. Cuando el
compilador detecta que un delegate devuelve void crea una instancia de
MulticastDelegate en lugar de una de Delegate.
4/11
Delegates y Eventos
Eventos.
En su sentido ms concreto, un evento es un campo o propiedad de una clase o
estructura. El tipo del evento es delegate, lo cual quiere decir que puede referenciar a
una lista de mtodos.
Lo interesante de los eventos es que son utilizados por la clase a la que pertenecen para
notificar que algo ha sucedido a otras clases.
5/11
Delegates y Eventos
//Delegate que ser utilizado como tipo base del evento MiRefME
public delegate void ReferenciaManejadoresEventos (object fuente,
ArgumentosEvento eventArgs);
//Clase productora o fuente del evento MiRefME
public class MiFuenteEventos
{
//MiRefME es el evento, su tipo est determinado por el delegate
//ReferenciaManejadoresEventos
public event ReferenciaManejadoresEventos MiRefME;
//Este mtodo ser llamado por los consumidores de eventos
//para suscribirse al evento
public void AadirManejador (MiManejadorEventos manejador)
{
//Aade a la lista de mtodos manejadores la referencia al
//mtodo ManejadorMiFuenteEventos, el cual ha de existir
//en el objeto manejador y ser el mtodo del consumidor
//al que se llame cuando se de el evento MiRefME
this.MiRefME
+=
new
ReferenciaManejadoresEventos
(manejador.ManejadorMiFuenteEventos);
}
//Este mtodo ser llamado cuando se desee lanzar el evento
public void LanzarEvento ()
{
//A travs de MiRefME se invoca a todos los mtodos
//manejadores registrados en la lista referenciada por
//MiRefME.
this.MiRefME
(this,new
ArgumentosEvento
("MiFuenteEventos"));
}
}
delegate
void
en este ejemplo como puede verse, al invocar a los mtodos manejadores del evento se
le pasan dos argumentos (que es el caso ms comn):
fuente
representa la clase del objeto que ha generado el evento.
eventArgs
representa los argumentos del evento.
6/11
Delegates y Eventos
7/11
Delegates y Eventos
Suscripcin al evento.
Una vez se dispone de las clases productora o fuente y consumidora o manejadora es
posible crear objetos de ambas y conectarlos entre s. Al mecanismo de conexin entre
manejador y fuente se le llama suscripcin y consiste en aadir la referencia al
mtodo manejador del evento a la lista de referencias del evento (MiRefME).
Siguiendo con el ejemplo anterior:
public class Aplicacion {
public static void Main(string [] args)
{
MiFuenteEventos MFE = new MiFuenteEventos ();
MiManejadorEventos MME = new MiManejadorEventos ();
//Suscripcin al evento
MFE.AadirManejador (MME);
...
...
8/11
Delegates y Eventos
MFE.AadirManejador (MME);
System.Console.WriteLine ("Si desea lanzar el evento pulse
Enter");
System.Console.ReadLine();
//Lanzamiento del evento
MFE.LanzarEvento ();
}
}
El ejemplo completo.
El resultado de unir el cdigo comentado es:
using System;
//Al notificar que ha sucedido un evento, lo ms comn
//es que se desee dar alguna informacin ms.
//Esto puede hacerse utilizando una clase derivada de EventArgs
//en la que se indiquen los argumentos del evento.
public class ArgumentosEvento : EventArgs
{
public string fuenteEvento;
public ArgumentosEvento (string fuenteEvento)
{
this.fuenteEvento = fuenteEvento;
}
}
//Delegate que ser utilizado como tipo base del evento MiRefME
public delegate void ReferenciaManejadoresEventos (object fuente,
ArgumentosEvento eventArgs);
//Clase productora o fuente del evento MiRefME
public class MiFuenteEventos
{
//MiRefME es el evento, su tipo est determinado por el delegate
//ReferenciaManejadoresEventos
public event ReferenciaManejadoresEventos MiRefME;
//Este mtodo ser llamado por los consumidores de eventos
//para suscribirse al evento
public void AadirManejador (MiManejadorEventos manejador)
{
//Aade a la lista de mtodos manejadores la referencia al
//mtodo ManejadorMiFuenteEventos, el cual ha de existir
//en el objeto manejador y ser el mtodo del consumidor
//al que se llame cuando se de el evento MiRefME
this.MiRefME
+=
new
ReferenciaManejadoresEventos
(manejador.ManejadorMiFuenteEventos);
}
//Este mtodo ser llamado cuando se desee lanzar el evento
public void LanzarEvento ()
{
9/11
Delegates y Eventos
Figura 8.4
10/11
Delegates y Eventos
Figura 8.5
11/11