PDF de programación - Relación entre delegados y eventos

Relación entre delegados y eventosgráfica de visualizaciones

Actualizado el 22 de Noviembre del 2020 (Publicado el 17 de Julio del 2017)
422 visualizaciones desde el 17 de Julio del 2017
428,7 KB
6 paginas
Creado hace 14a (22/10/2006)
Guillermo “Guille” Som

dnm.inicio.fundamentos
dnm.incio.fundamentos

Relación entre delegados y eventos
El avisador que te avise, buen avisador será

En el número anterior vimos con detalle casi todo lo concerniente a los delegados, y
aunque solo lo viésemos de pasada, comprobamos la relación entre los delegados y
los eventos. En este número nos centraremos en los eventos, pero antes comproba-
remos que hay ciertas características de los delegados que los hacen imprescindibles
para usarlos con los eventos.

<<

Delegados

Delegados multidifusión:unión de varios delegados

Cuando definimos un delegado tanto en C# como
en Visual Basic usamos la instrucción delegate. Esa ins-
trucción en realidad lo que hace es definir un tipo de
datos especial. Y la primera impresión es que en reali-
dad esa instrucción utiliza el tipo definido en la propia
librería de clases de .NET que tiene el mismo nombre:
System.Delegate. Pero no es así: en realidad el tipo de
datos que obtenemos con una declaración por medio
de la palabra clave delegate es System.Multicast
Delegate, que está basada en la clase Delegate.

En esta primera parte del artículo nos centrare-
mos en la clase MulticastDelegate y en cómo se pue-
den agrupar varios métodos delegados en un mismo
objeto delegado, además de ver cómo podemos invo-
car a todos esos métodos con una sola llamada.

NOTA

tamaño (de las letras) sí que importa. ]
[

A lo largo de este artículo, usaré delegate
con la primera letra en minúscula para referir-
me a la instrucción que tanto C# como Visual
Basic utilizan para definir delegados. Pero cuan-
do quiera hacer referencia a la clase System.
Delegate, usaré la primera letra en mayúscula;
así los programadores de C# no se confundirán
con los cambios de mayúsculas y minúsculas
que tanto les afecta, porque en ese lenguaje, el

Guillermo “Guille” Som
es Microsoft MVP de Visual Basic
desde 1997.Es redactor de
dotNetManía,miembro de Ineta
Speakers Bureau Latin America,
mentor de Solid Quality
Iberoamericana y autor del libro
Manual Imprescindible de
Visual Basic .NET.
http://www.elguille.info

Como ya comenté en el artículo anterior, los dele-
gados multidifusión son los que en realidad nos per-
miten que los eventos tengan el comportamiento que
tienen y nos permitan utilizarlos de forma muy fle-
xible. En un momento veremos por qué.

Al usar la instrucción delegate, creamos en rea-
lidad un objeto de tipo MulticastDelegate. Veamos
que nos dice la documentación de Visual Studio 2005
sobre esta clase:

Representa un delegado multidifusión; es decir, un
delegado que puede tener más de un elemento en su lista
de invocación.

Está claro, en este caso no hay dudas sobre el sig-
nificado. Y debido a que éste es el tipo de delegado
que siempre usaremos (o al menos el que usaremos
en un gran porcentaje de las ocasiones), en adelan-
te al indicar que usamos un delegado será para refe-
rirnos a este tipo de delegado que permite tener más
de un elemento asociado, ya que, como acabamos de
comprobar, los delegados que podemos crear por
medio de la instrucción delegate son de este tipo de
delegados “compuestos”.

Ahora que sabemos qué es un delegado multidi-
fusión, veamos cómo podemos unir varios delega-
dos en uno solo.

Agregar delegados a la lista de un delegado multi-
difusión

En C# los operadores += y -= están sobrecarga-
dos para poder utilizarlos con este tipo de delega-
dos, de forma que si queremos añadir más de un dele-

a
í
n
a
M
t
e
N
t
o
d

<
<

45

<<

dnm.inicio.fundamentos

gado a la lista de delegados lo haremos usando preci-
samente el operador de asignación e incremento (+=).
Veamos un ejemplo de cómo agrupar varios delega-
dos y cómo invocarlos, y cuando veamos lo que ocu-
rre, lo tendremos todo más claro.

En el fuente 1 tenemos una definición de un dele-
gado, el cual es una plantilla para un método de tipo
void (no devuelve nada) y que recibe como paráme-
tro una cadena. En ese mismo código fuente, tene-
mos tres métodos que podemos usar con una varia-
ble definida mediante ese delegado; cada uno de los
métodos muestra la cadena pasada como argumento
en la consola, pero de forma diferente, con la idea de
que podamos ver que es lo que en realidad está ocu-
rriendo.

Pero lo que aquí tenemos que “demostrar” es cómo
agregar más de un método a una misma variable, y tal
como vimos al principio de esta sección, debemos
hacerlo mediante el operador +=, por tanto, si usamos
el código mostrado en el fuente 3, conseguiremos lo
que estamos buscando.

MostrarCadenaCallback delegado2;
delegado2 = new MostrarCadenaCallback(mostrarStr);
delegado2 += new MostrarCadenaCallback(mostrarLower);
delegado2 += mostrarUpper;

delegado2(“¡Hola Delegado!”);

Fuente 3.Asociar varios métodos con una misma variable de
tipo delegado

// La definición del delegado
delegate void MostrarCadenaCallback(string str);

// Varias definiciones del método con la firma adecuada
// para el delegado MostrarCadenaCallback

// Muestra la cadena sin alterar
static void mostrarStr(string str){

Console.WriteLine(str);

}
// Muestra la cadena en mayúsculas
static void mostrarUpper(string str){
Console.WriteLine(str.ToUpper());

}
// Muestra la cadena en minúsculas
static void mostrarLower(string str){
Console.WriteLine(str.ToLower());

}

Fuente 1. Definición de un delegado y tres métodos que
tienen la misma firma

Para usar ese delegado y asociarlo a cualquiera de los
métodos lo haríamos tal como vemos en el fuente 2. En
este caso solo usamos uno de los tres métodos que hemos
definido, en particular el método mostrarUpper.

MostrarCadenaCallback delegado1;
//delegado1 = new MostrarCadenaCallback(mostrarUpper);
delegado1 = mostrarUpper;

delegado1(“Hola delegado”);

Fuente 2. La forma habitual de usar un delegado e invocarlo

Al ejecutar el código del fuente 2, comprobare-
mos que el mensaje indicado se muestra completa-
mente en mayúsculas, que en realidad es lo que espe-
ramos que ocurra, y tal como vimos en el artículo ante-
rior tenemos dos formas de asignar a la variable dele-
gado1 el método que vamos a usar; la asignación que
está comentada es la que tendríamos que usar en las
versiones anteriores a Visual C# 2005.

a
í
n
a
M
t
e
N
t
o
d

<
<

46

Como vemos en dicho código fuente, la forma de
asociar varios delegados es la misma que cuando asig-
namos solo uno, con la única diferencia del operador
usado para dicha asignación. Y con el operador de
asignación y suma también podemos usar las dos for-
mas de asignar el método al que se llamará desde el
delegado.

Lo más interesante de todo esto está en la última
línea. Cuando invocamos al delegado pasándole el pará-
metro que espera (en este caso una cadena), éste se encar-
gará de llamar secuencialmente a todos y cada uno de
los métodos delegados que hayamos añadido a la varia-
ble que hace referencia al delegado multidifusión.

El orden de llamada a cada uno de los métodos
que tenemos en la lista del delegado es el mismo en
el que hemos añadido esos métodos; por tanto, el códi-
go del fuente 3 producirá la siguiente salida:

¡Hola Delegado!
¡hola delegado!
¡HOLA DELEGADO!

De la misma forma que podemos añadir nuevos
métodos a un delegado, podemos quitar métodos que
previamente hayamos añadido. Para ello usaremos el
operador -=, el cual se usa exactamente como el que
acabamos de ver, pero su función es eliminar delega-
dos de la lista. Si queremos quitar un delegado que
no está previamente añadido no se produce ninguna
excepción; simplemente la petición se ignora.

Si al código del fuente 3 le agregamos la siguien-
te línea antes de llamar al delegado, lo que consegui-
remos es que solo haya dos métodos en la lista del
delegado:

delegado2 -= mostrarLower;

Nuevamente comprobamos que también pode-
mos usar la forma “abreviada” para quitar métodos de
la lista de delegados.

NOTA

Definir eventos

<<

dnm.inicio.fundamentos

En Visual Basic no hay forma de añadir y quitar métodos de
la lista de un delegado multidifusión,al menos de la forma como
se hace con C#.La única forma de hacerlo es por medio de los
métodos compartidos Combine y Remove de la clase Delegate o
del delegado que definamos, aunque el valor devuelto siempre
es del tipo Delegate. Para llamar al delegado podemos usar el
método Invoke de la clase Delegate o bien usar la llamada direc-
ta, en cuyo caso el objeto debe ser del tipo del delegado que
estamos combinando. En el código de ejemplo que acompaña
al artículo hay varios métodos con distintas formas de usar el
método Combine y Remove.

Todo esto es así de complicado si trabajamos directamen-
te con delegados que no están relacionados con eventos,ya que
si trabajamos con eventos, podemos usar las instrucciones
AddHandler y RemoveHandler para conseguir la misma fun-
cionalidad de los operadores += y -= respectivamente.

Nomenclatura en las definiciones de los delegados

Para finalizar el tema de los delegados, una nota

sobre la nomenclatura recomendada.

En la definición de los delegados se recomienda
el sufijo EventHandler para los nombres de delegados
que se utilizan en eventos y el sufijo Callback para los
nombres de delegados que no sean manejadores de
eventos.

En caso de que definamos una clase para usar como
parámetro de un delegado relacionado con un even-
to, debemos añadirle el sufijo EventArgs si dicha cla-
se se deriva de System.EventArgs.

Una vez hechas estas aclaraciones, pasemos a ver

qué son y cómo definir y usar los eventos.

¿Qué es un evento?

Un evento es un mensaje (o notificación) que lan-
za un objeto de una clase determinada cuando algo ha
ocurrido. El ejemplo más clásico y fácil de entender
es cuando el usuario pulsa con el ratón en un botón
de un formulario. Esa acción produce, entre otros, el
evento Click del botón en el que se ha pulsado. De
esa forma, el botón notifica que esa acción ha ocurri-
do, y ya es cuestión nuestra que hagamos algo cuan-
do eso ocurra. Si estamos interesados en interceptar
ese evento tendremos que comunicárselo a la clase que
define el botón; si no lo e
  • Links de descarga
http://lwp-l.com/pdf5508

Comentarios de: Relación entre delegados y eventos (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad