C sharp - Diferencia funcional entre un evento y un delegado

 
Vista:
sin imagen de perfil

Diferencia funcional entre un evento y un delegado

Publicado por Yordanis (4 intervenciones) el 08/11/2016 00:54:38
Hola.

Aprendiendo acerca de los eventos en C# y analizando algunos ejemplos sencillos que ponen en https://msdn.microsoft.com/es-es/library/aa288460(v=vs.71).aspx

No acabo de comprender o ver cual es la diferencia (según esos ejemplos) entre evento y delegado. Ya sé que un evento se declara con la palabra clave event delante y que es del tipo delegado. Ok pero según estos ejemplos y otros sencillos igual que he visto en la web si suprimo la palabra event del código (no declaro el evento sino un delegado directamente) me funciona igual, es decir, me da los mismos resultados.

No acabo de ver que se puede hacer con un evento que no se pueda hacer con un delegado??

En el ejemplo del link arriba cambie este código

public event ChangedEventHandler Changed;

por este

public ChangedEventHandler Changed; (quite la palabra event)

Y me arrojó el mismo resultado.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Diferencia funcional entre un evento y un delegado

Publicado por Nacho (115 intervenciones) el 08/11/2016 09:47:15
Un error bastante común. Es como confundir un televisor con una imagen, o un robo con una noticia.

Un delegado es una función. Declaras un puntero a una función con sus parámetros y su retorno, y un evento es un hecho. Lo único que tiene en común un evento con un delegado es que al producirse ese evento se llama a esa función, ese delegado. La palabra clave event no define un tipo de función, no cambia en nada el exe resultante, sólo especifica al lector del código qué delegado se va a llamar cuando se produzca ese evento.

El concepto de delegado existe desde siempre en programación; es un puntero a una función. El concepto de evento nace con los sistemas operativos que usamos ahora. Antes, como en el msdos, lo que se hacía era soltar el puntero de instrucciones de la cpu en una posición de memoria, darle a la cpu una dirección de memoria desde la que empezar, y a partir de ahí echaba a correr por toda la memoria ejecutando lo que encontrara. Ahora no. Ahora el puntero ese lo tiene el sistema operativo, apunta a código del sistema operativo, y va dándoselo a las diversas aplicaciones, llamando delegados en esas aplicaciones, dependiendo de qué evento se haya producido, para devolvérselo otra vez lo antes posible.

La programación orientada a objetos también hace uso de esa manera de funcionar. Tienes una aplicación, y esa aplicación puede ceder el control a otra parte de esa aplicación, a un objeto, cuando se produce un determinado evento, un hecho, el que sea. Defines qué función se llamará con el delegado, y pones nombre al evento (cambio de un valor, tiempo transcurrido, botón pulsado...) tras el que llamarás a esa función.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Diferencia funcional entre un evento y un delegado

Publicado por Yordanis (4 intervenciones) el 11/11/2016 05:17:18
Gracias por tu respuesta.

No creo que yo pueda confundir la imagen con el televisor.

Pienso que no se use una palabra clave en un lenguaje de programación sólo para darle al lector del código información (para eso están los comentarios)

El lector puede saber cual delegado se va a llamar con tan sólo ver el tipo del campo.

public ChangedEventHandler Changed; (ya te dice que es del tipo delegado ChangedEventHandler sin tener que poner la palabra clave event)

Estoy muy lejos de ser un experto en esto pues tan sólo estoy comenzando. Estuve leyendo un tutorial en formato pdf de C#, no dice el autor pero en el pie de página decía José Antonio González Seco, este tutorial se mete más adentro en el lenguaje. Y en el capítulo sobre eventos decía textualmente

"Un evento es una variante de las propiedades para los campos cuyos tipos sean
delegados. Es decir, permiten controlar la forman en que se accede a los campos
delegados y dan la posibilidad de asociar código a ejecutar cada vez que se añada o
elimine un método de un campo delegado.."[/
i]

Otra parte decía

Desde código ubicado dentro del mismo tipo de dato donde se haya definido el evento
se puede usar el evento tal y como si de un campo delegado normal se tratase. Sin
embargo, desde código ubicado externamente se imponen una serie de restricciones que
permiten controlar la forma en que se accede al mismo. Éstas son:
· No se le puede aplicar los métodos heredados de System.MulticastDelegate.
· Sólo se le puede aplicar dos operaciones: añadido de métodos con += y
eliminación de métodos con -=. De este modo se evita que se use sin querer = en
vez de += ó -= y se sustituyan todos los métodos de la lista de métodos del
campo delegado por otro que en realidad se le quería añadir o quitar (si ese otro
valiese null, ello incluso podría provocar una System.NullReferenceException)
· No es posible llamar a los métodos almacenados en un campo delegado a través
del mismo. Esto permite controlar la forma en que se les llama, ya que obliga a
que la llamada tenga que hacerse a través de algún método público definido en la
definición del tipo de dato donde el evento fue definido.


Y por último que es lo que más me aclaró mi duda es:

[i]La verdadera utilidad de un evento es que permite controlar la forma en que se asocian y
quitan métodos de los objetos delegados con += y -=.


En fin según lo que he leído hasta ahora para "escuchar" un evento (un clic, una ventana que se cierra, etc) se puede usar un delegado normal sin tener que usar la palabra clave event.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Diferencia funcional entre un evento y un delegado

Publicado por Nacho (115 intervenciones) el 11/11/2016 11:58:15
Me lo han puesto a huevo.

http://www.lawebdelprogramador.com/foros/Ensamblador/1575518-De-numero-a-caracter-en-ensamblador.html

Me alegro de que acabes de empezar. Yo hice eso mismo hace más de 30 años. Empecé ensamblador con el z80, programación de sistemas con el cp/m. El primer programa en c# lo hice con el delphi 8, hace más de 10 años.

Evidentemente, los compiladores, el más importante lector de código, te ponen montones de restricciones, cosa que no hace el ensamblador, pero son para que no te líes tú solo, no porque una cosa sea distinta de otra. Cuando no percibes ese hecho te aparecen problemas como el de Carlos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Diferencia funcional entre un evento y un delegado

Publicado por Alvaro (1 intervención) el 27/08/2018 13:48:49
La duda me parece muy interesante, y creo que no está resuelta: ¿Porqué la necesidad del evento si se puede usar simplemente un delegado? Pareciera incluso que el evento sea simplemente una forma de etiquetar al delegado, pero debe (o debería) tener una función y razón de ser más necesaria y justificada que esa. Ojalá alguien lo pueda aclarar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar