Eventos vs Delegados

25/05/2008 - 03:48 por Michael Soza | Informe spam
Quisiera saber cual es la diferencia entre un evento y un delegado.e
estudiado ambos, pero aun no puedo esclarecer el proposito de la instruccion
event, pongo como ejemplo el siguiente codigo. En el cree un evento que se
lanza cuando aumento la edad y un delegado que se lanza en la misma
situacion.si el metodo que hubiera asociado a ambos fuera el
mismo no habria causal para utilizar eventque alguen me
ayude porfavor a entender esto!!!!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace gen
{
class Program
{
static void Main(string[] args)
{
loco makol = new loco("Michael", "Soza", 23);
makol.mehagoviejo += new EventHandler(makol.makol_mehagoviejo);
makol.saludo += new loco.Saludar(MostrarEdad);
makol.Edad++;
makol.Edad++;
makol.Edad++;
Console.ReadLine();
}
static public void MostrarEdad(int algo)
{
Console.WriteLine("Tengo {0}",algo);
}

}

class loco
{
string nombre, apellido;
public event EventHandler mehagoviejo;
public delegate void Saludar(int algo);
public Saludar saludo;
int edad;
public loco(string nom, string app, int ed)
{
nombre = nom;
apellido = app;
edad = ed;
}

public string Nombre {
get { return nombre; }
set { nombre = value; }
}
public string Apellido
{
get { return apellido; }
set { apellido = value; }
}
public int Edad
{
get { return edad; }
set {
if (value>edad)
{
mehagoviejo(this, EventArgs.Empty);
saludo(this.edad);
}
edad = value; }
}
public void makol_mehagoviejo(object sender, EventArgs e) {
Console.WriteLine("me hago mas viejo");
}
}

}

Preguntas similare

Leer las respuestas

#6 Michael Soza
28/05/2008 - 00:39 | Informe spam
Ok, ok...creo que capte lo que mencionancitando a la
documentacion de C# :
Within a class that declares an event member, the event behaves just like a
field of a delegate type (provided the event is not abstract and does not
declare accessors). The field stores a reference to a delegate that
represents the event handlers that have been added to the event. If no event
handles are present, the field is null.

En definitiva el evento se comporta tal cual una instancia de un delegado
excepto que:
1.El evento solo se declara dentro de una clase. No asi el delegado que se
puede declarar afuera.
2.El evento puede tener accesors(no halle como traducir eso), ejemplo:
public event DatosCambiadosEventHandler DatosCambiados
{
add
{
datosCambiados += value;
Console.WriteLine("El método a notificar es: {0}",
value.Method.Name);
Console.WriteLine("Se añade un delegado al evento DatosCambiados");
}
remove
{
datosCambiados -= value;
Console.WriteLine("Se elimina un delegado al evento
DatosCambiados");
}
}
3. el evento puede declararse abstracto

En conclusion SI es mas conveniente para manejar las notificaciones de una
clase u objeto la utilizacion de "event"...uffff espero no haber
dado la lata con el tema...es que de verdad me tenia intrigado
buenos Saludos a todos..

"Octavio Hernandez" escribió en el mensaje
de noticias:euUxqO#
La manera en que yo defino qué es un evento en mis cursos de iniciación, y
que creo
que "llega" bastante bien a la gente, es la siguiente:

"UN EVENTO ES (MAS O MENOS) UNA PROPIEDAD CUYO TIPO ES UN TIPO DELEGADO"

Por supuesto, en ese momento ya se han presentado los conceptos de
delegado
(como parte del sistema de tipos de .NET) y de propiedad (como parte del
mismo
tema que los eventos, las clases y sus posibilidades).

Después de dar la definición, uso como ejemplo la clase Persona. Del mismo
modo que
ésta tiene una propiedad Nombre, de tipo string, o Edad, de tipo int,
podemos
agregarle otra "propiedad" FestejarCumpleaños (un evento) a la que
podremos
asignar las acciones que la persona concreta realizará el día de su
cumple. Por ejemplo,

Persona p = new Persona();
p.Nombre = "Pepe";
p.Edad = 26;
p.FestejarCumpleaños += InvitarNoviaACenar;
p.FestejarCumpleaños += IrAlCine;
// etc.

Observa que de la definición que he dado se desprende que los eventos solo
pueden
definirse dentro de una clase (como las propiedades), que pueden "apuntar"
a más de
una función (como los delegados), y que solo se le pueden aplicar las
mismas operaciones
que a los delegados (+=, -=).

Salu2 - Octavio



"Michael Soza" wrote in message
news:
Estimado, los delegados pueden apuntar a mas de una funcion sin
inconveniente, por lo cual mi duda aun persiste. No puedo encontrar algo
que diferencie a los eventos de los delegados :(
ejemplo:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
public delegate void Saludar(string nombre);
public Program()
{
Saludar saludo = new Saludar(MostrarSaludo);
saludo += new Saludar(SaludoDespedir);
saludo("Michael");
}
private void MostrarSaludo(string Nombre)
{
Console.WriteLine("Hola {0}",Nombre);
}
private void SaludoDespedir(string Nombre)
{
Console.WriteLine("Adios {0}", Nombre);
}

static void Main(string[] args)
{
Program p = new Program();
Console.ReadLine();
}

}
}

"Fernando Gómez" escribió en el mensaje de
noticias:
On May 26, 12:34 pm, Fernando Gómez
wrote:
On May 24, 8:48 pm, "Michael Soza" wrote:



> Quisiera saber cual es la diferencia entre un evento y un
> delegado.e
> estudiado ambos, pero aun no puedo esclarecer el proposito de la
> instruccion
> event, pongo como ejemplo el siguiente codigo. En el cree un evento
> que se
> lanza cuando aumento la edad y un delegado que se lanza en la misma
> situacion.si el metodo que hubiera asociado a ambos fuera
> el
> mismo no habria causal para utilizar eventque alguen
> me
> ayude porfavor a entender esto!!!!

> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;

> namespace gen
> {
> class Program
> {
> static void Main(string[] args)
> {
> loco makol = new loco("Michael", "Soza", 23);
> makol.mehagoviejo += new
> EventHandler(makol.makol_mehagoviejo);
> makol.saludo += new loco.Saludar(MostrarEdad);
> makol.Edad++;
> makol.Edad++;
> makol.Edad++;
> Console.ReadLine();
> }
> static public void MostrarEdad(int algo)
> {
> Console.WriteLine("Tengo {0}",algo);
> }

> }

> class loco
> {
> string nombre, apellido;
> public event EventHandler mehagoviejo;
> public delegate void Saludar(int algo);
> public Saludar saludo;
> int edad;
> public loco(string nom, string app, int ed)
> {
> nombre = nom;
> apellido = app;
> edad = ed;
> }

> public string Nombre {
> get { return nombre; }
> set { nombre = value; }
> }
> public string Apellido
> {
> get { return apellido; }
> set { apellido = value; }
> }
> public int Edad
> {
> get { return edad; }
> set {
> if (value>edad)
> {
> mehagoviejo(this, EventArgs.Empty);
> saludo(this.edad);
> }
> edad = value; }
> }
> public void makol_mehagoviejo(object sender, EventArgs e) {
> Console.WriteLine("me hago mas viejo");
> }
> }

> }

Un delegado es un "callback", es decir, una variable cuyo valor, en
vez de ser una referencia en memoria, es una referencia a una función/
método. Un evento es una colección de referencias a funciones que, en
el momento en el que se dispara, son llamados. Los eventos, por ende,
hacen uso extensivo de los delegados (i.e. referencias a funciones).

En tu caso, no es necesario que crees un delegado, ya que el delegado
empleado es EventHandler. Luego entonces, solo necesitas una función
que cumpla con el prototipo del delegado EventHandler.

class loco
{
string nombre, apellido;
public event EventHandler mehagoviejo;
public Saludar saludo;
int edad;

public loco(string nom, string app, int ed)
{
nombre = nom;
apellido = app;
edad = ed;
}

public string Nombre {
get { return nombre; }
set { nombre = value; }
}
public string Apellido
{
get { return apellido; }
set { apellido = value; }
}
public int Edad
{
get { return edad; }
set {
if (value>edad)
{
mehagoviejo(this, EventArgs.Empty);
saludo(this.edad);
}
edad = value; }
}

public void OnMeHagoViejo(object sender, EventArgs e)
{
// hacer algo aquí
}

public void makol_mehagoviejo(object sender, EventArgs e) {
Console.WriteLine("me hago mas viejo");
}
}

static void Main(string[] args)
{
loco makol = new loco("Michael", "Soza", 23);
makol.mehagoviejo += new
EventHandler(makol.OnMeHagoViejo);
makol.Edad++;
makol.Edad++;
makol.Edad++;
Console.ReadLine();
}



Por cierto, un delegado solo puede apuntar a una sola función,
mientras que un evento tiene una colección de funciones (delegados),
por lo que podrías tener varias funciones que se disparen al mismo
tiempo.

Quizás esa sea la diferencia más importante.

Saludos.






Respuesta Responder a este mensaje
#7 Octavio Hernandez
28/05/2008 - 00:48 | Informe spam
""accessor" normalmente se traduce como "métodos de acceso"; el "get" es el
método de acceso de lectura, y el "set" el de escritura.

Slds - Octavio


"Michael Soza" wrote in message
news:
Ok, ok...creo que capte lo que mencionancitando a la
documentacion de C# :
Within a class that declares an event member, the event behaves just like
a field of a delegate type (provided the event is not abstract and does
not declare accessors). The field stores a reference to a delegate that
represents the event handlers that have been added to the event. If no
event handles are present, the field is null.

En definitiva el evento se comporta tal cual una instancia de un delegado
excepto que:
1.El evento solo se declara dentro de una clase. No asi el delegado que se
puede declarar afuera.
2.El evento puede tener accesors(no halle como traducir eso), ejemplo:
public event DatosCambiadosEventHandler DatosCambiados
{
add
{
datosCambiados += value;
Console.WriteLine("El método a notificar es: {0}",
value.Method.Name);
Console.WriteLine("Se añade un delegado al evento DatosCambiados");
}
remove
{
datosCambiados -= value;
Console.WriteLine("Se elimina un delegado al evento
DatosCambiados");
}
}
3. el evento puede declararse abstracto

En conclusion SI es mas conveniente para manejar las notificaciones de una
clase u objeto la utilizacion de "event"...uffff espero no haber
dado la lata con el tema...es que de verdad me tenia intrigado
buenos Saludos a todos..

"Octavio Hernandez" escribió en el mensaje
de noticias:euUxqO#
La manera en que yo defino qué es un evento en mis cursos de iniciación,
y que creo
que "llega" bastante bien a la gente, es la siguiente:

"UN EVENTO ES (MAS O MENOS) UNA PROPIEDAD CUYO TIPO ES UN TIPO DELEGADO"

Por supuesto, en ese momento ya se han presentado los conceptos de
delegado
(como parte del sistema de tipos de .NET) y de propiedad (como parte del
mismo
tema que los eventos, las clases y sus posibilidades).

Después de dar la definición, uso como ejemplo la clase Persona. Del
mismo modo que
ésta tiene una propiedad Nombre, de tipo string, o Edad, de tipo int,
podemos
agregarle otra "propiedad" FestejarCumpleaños (un evento) a la que
podremos
asignar las acciones que la persona concreta realizará el día de su
cumple. Por ejemplo,

Persona p = new Persona();
p.Nombre = "Pepe";
p.Edad = 26;
p.FestejarCumpleaños += InvitarNoviaACenar;
p.FestejarCumpleaños += IrAlCine;
// etc.

Observa que de la definición que he dado se desprende que los eventos
solo pueden
definirse dentro de una clase (como las propiedades), que pueden
"apuntar" a más de
una función (como los delegados), y que solo se le pueden aplicar las
mismas operaciones
que a los delegados (+=, -=).

Salu2 - Octavio



"Michael Soza" wrote in message
news:
Estimado, los delegados pueden apuntar a mas de una funcion sin
inconveniente, por lo cual mi duda aun persiste. No puedo encontrar
algo que diferencie a los eventos de los delegados :(
ejemplo:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
public delegate void Saludar(string nombre);
public Program()
{
Saludar saludo = new Saludar(MostrarSaludo);
saludo += new Saludar(SaludoDespedir);
saludo("Michael");
}
private void MostrarSaludo(string Nombre)
{
Console.WriteLine("Hola {0}",Nombre);
}
private void SaludoDespedir(string Nombre)
{
Console.WriteLine("Adios {0}", Nombre);
}

static void Main(string[] args)
{
Program p = new Program();
Console.ReadLine();
}

}
}

"Fernando Gómez" escribió en el mensaje
de
noticias:
On May 26, 12:34 pm, Fernando Gómez
wrote:
On May 24, 8:48 pm, "Michael Soza" wrote:



> Quisiera saber cual es la diferencia entre un evento y un
> delegado.e
> estudiado ambos, pero aun no puedo esclarecer el proposito de la
> instruccion
> event, pongo como ejemplo el siguiente codigo. En el cree un evento
> que se
> lanza cuando aumento la edad y un delegado que se lanza en la misma
> situacion.si el metodo que hubiera asociado a ambos
> fuera el
> mismo no habria causal para utilizar eventque alguen
> me
> ayude porfavor a entender esto!!!!

> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Text;

> namespace gen
> {
> class Program
> {
> static void Main(string[] args)
> {
> loco makol = new loco("Michael", "Soza", 23);
> makol.mehagoviejo += new
> EventHandler(makol.makol_mehagoviejo);
> makol.saludo += new loco.Saludar(MostrarEdad);
> makol.Edad++;
> makol.Edad++;
> makol.Edad++;
> Console.ReadLine();
> }
> static public void MostrarEdad(int algo)
> {
> Console.WriteLine("Tengo {0}",algo);
> }

> }

> class loco
> {
> string nombre, apellido;
> public event EventHandler mehagoviejo;
> public delegate void Saludar(int algo);
> public Saludar saludo;
> int edad;
> public loco(string nom, string app, int ed)
> {
> nombre = nom;
> apellido = app;
> edad = ed;
> }

> public string Nombre {
> get { return nombre; }
> set { nombre = value; }
> }
> public string Apellido
> {
> get { return apellido; }
> set { apellido = value; }
> }
> public int Edad
> {
> get { return edad; }
> set {
> if (value>edad)
> {
> mehagoviejo(this, EventArgs.Empty);
> saludo(this.edad);
> }
> edad = value; }
> }
> public void makol_mehagoviejo(object sender, EventArgs e) {
> Console.WriteLine("me hago mas viejo");
> }
> }

> }

Un delegado es un "callback", es decir, una variable cuyo valor, en
vez de ser una referencia en memoria, es una referencia a una función/
método. Un evento es una colección de referencias a funciones que, en
el momento en el que se dispara, son llamados. Los eventos, por ende,
hacen uso extensivo de los delegados (i.e. referencias a funciones).

En tu caso, no es necesario que crees un delegado, ya que el delegado
empleado es EventHandler. Luego entonces, solo necesitas una función
que cumpla con el prototipo del delegado EventHandler.

class loco
{
string nombre, apellido;
public event EventHandler mehagoviejo;
public Saludar saludo;
int edad;

public loco(string nom, string app, int ed)
{
nombre = nom;
apellido = app;
edad = ed;
}

public string Nombre {
get { return nombre; }
set { nombre = value; }
}
public string Apellido
{
get { return apellido; }
set { apellido = value; }
}
public int Edad
{
get { return edad; }
set {
if (value>edad)
{
mehagoviejo(this, EventArgs.Empty);
saludo(this.edad);
}
edad = value; }
}

public void OnMeHagoViejo(object sender, EventArgs e)
{
// hacer algo aquí
}

public void makol_mehagoviejo(object sender, EventArgs e) {
Console.WriteLine("me hago mas viejo");
}
}

static void Main(string[] args)
{
loco makol = new loco("Michael", "Soza", 23);
makol.mehagoviejo += new
EventHandler(makol.OnMeHagoViejo);
makol.Edad++;
makol.Edad++;
makol.Edad++;
Console.ReadLine();
}



Por cierto, un delegado solo puede apuntar a una sola función,
mientras que un evento tiene una colección de funciones (delegados),
por lo que podrías tener varias funciones que se disparen al mismo
tiempo.

Quizás esa sea la diferencia más importante.

Saludos.






Respuesta Responder a este mensaje
#8 Michael Soza
28/05/2008 - 02:14 | Informe spam
vale...entonces los events tienen métodos de acceso del tipo "add" y
"remove"
Saludos, Michael.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida