Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: final_frontier en 16 Agosto 2010, 21:02 pm



Título: [Solucionado][Duda][C#]Eventos y delegados
Publicado por: final_frontier en 16 Agosto 2010, 21:02 pm
(D4N93R me mata :xD)

Buenas, el caso es que tengo un pequeño code en C#, tengo un evento y un delegado pero el evento no llama al delegado cada vez que hago el cambio pertinente...

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace NewEventClase
  7. {
  8.    class Program
  9.    {
  10.        static void Main(string[] args)
  11.        {
  12.            eventos obj = new eventos();
  13.            int a = 3;
  14.            obj.delegado(obj.numero, a);
  15.            obj.numero = a;
  16.            for (int i = 1; i < 10; i++)
  17.                obj.numero = i;
  18.            Console.ReadLine();
  19.        }
  20.    }
  21.  
  22.    class eventos
  23.    {
  24.        public eventos()
  25.        {
  26.            _numero = 0;
  27.            delegado = new DatosHandlerEvent(danumero);
  28.        }
  29.  
  30.        private void danumero(int a, int b)
  31.        {
  32.            if(a!=b)
  33.                Console.WriteLine("Evento");
  34.        }
  35.  
  36.        public delegate void DatosHandlerEvent(int a, int b);
  37.        public event DatosHandlerEvent evento;
  38.        public DatosHandlerEvent delegado;
  39.  
  40.        private int _numero;
  41.        public int numero
  42.        {
  43.            get
  44.            {
  45.                return _numero;
  46.            }
  47.  
  48.            set
  49.            {
  50.                _numero = value;
  51.                if (evento != null)
  52.                {
  53.                    evento(value, _numero);
  54.                }
  55.            }
  56.        }
  57.    }
  58. }

¿Por qué no se ejecuta el evento en ese bucle del main?¿Qué tengo mal y como lo remedio?


Título: Re: [Duda][C#]Eventos y delegados
Publicado por: [D4N93R] en 16 Agosto 2010, 21:35 pm
if (evento != null), ves esa línea, si nadie se ha subscrito al evento, no se va a ejecutar.


De paso que el delegado no está haciendo nada ahí xD

Y el evento a quién quieres apuntar? a el mismo método del delegado?

En tu código cuando llamas a "delegado", este está apuntando a danumero según la línea:   delegado = new DatosHandlerEvent(danumero);

ok, eso lo entiendes, pero ahora cuando ingresas un número a la propiedad numero, en el bloque SET haces lo siguiente:

Código
  1.                _numero = value;
  2.                if (evento != null)
  3.                {
  4.                    evento(value, _numero);
  5.                }
  6.  

Luego de que se asigne el valor al miembro privado, se debería ejecutar el evento, pero no lo hace porque está NULL.

Para subscribirte un evento sería de la siguiente manera:

Código
  1. evento += new DatosHandlerEvent(danumero);

Es MUY parecido a lo que hiciste con el delegado, porque básicamente son lo mismo. PERO el delegado lo puedes "llamar/ejectutar" desde un contexto afuera de la clase, en cambio el evento NO. Por ejemplo:

obj.delegado(obj.numero, a); Se ejecuta bien
obj.evento(obj.numero, a); NO SE PUEDE

Esa es la diferencia entre ambos.

Saludos!

PD: que te mato ! xD



Título: Re: [Duda][C#]Eventos y delegados
Publicado por: final_frontier en 17 Agosto 2010, 14:42 pm
:xD Por lo menos ahora lo pillo :P
Gracias por la ayuda, ahora sí se me ejecuta el evento xD pondré el code por si sirve de referencia.

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. namespace NewEventClase
  7. {
  8.    class Program
  9.    {
  10.        static void Main(string[] args)
  11.        {
  12.            eventos obj = new eventos();
  13.            obj.numero = 0;
  14.            for (int i = 1; i < 10; i++)
  15.                obj.numero = i;
  16.            Console.ReadLine();
  17.        }
  18.    }
  19.  
  20.    class eventos
  21.    {
  22.        public eventos()
  23.        {
  24.            _numero = 0;
  25.            delegado = new DatosHandlerEvent(danumero);
  26.        }
  27.  
  28.        private void danumero(int a, int b)
  29.        {
  30.            if (a != b)
  31.                Console.WriteLine("Evento");
  32.  
  33.            else
  34.                Console.WriteLine("Lolazo");
  35.        }
  36.  
  37.        public delegate void DatosHandlerEvent(int a, int b);
  38.        public event DatosHandlerEvent evento;
  39.        public DatosHandlerEvent delegado;
  40.  
  41.        private int _numero;
  42.        public int numero
  43.        {
  44.            get
  45.            {
  46.                return _numero;
  47.            }
  48.  
  49.            set
  50.            {
  51.                if (evento == null)
  52.                {
  53.                    evento += new DatosHandlerEvent(danumero);
  54.                }
  55.  
  56.                evento(_numero, value);
  57.                _numero = value;
  58.  
  59.            }
  60.        }
  61.    }
  62. }


Título: Re: [Solucionado][Duda][C#]Eventos y delegados
Publicado por: [D4N93R] en 17 Agosto 2010, 14:52 pm
Ahmm, Final, así no es :D es algo así:

Código
  1. class eventos
  2.    {
  3.        public eventos()
  4.        {
  5.            _numero = 0;
  6.             evento += new DatosHandlerEvent(danumero);
  7.        }
  8.  
  9.        private void danumero(int a, int b)
  10.        {
  11.            if (a != b)
  12.                Console.WriteLine("Evento");
  13.  
  14.            else
  15.                Console.WriteLine("Lolazo");
  16.        }
  17.  
  18.        public delegate void DatosHandlerEvent(int a, int b);
  19.        public event DatosHandlerEvent evento;
  20.  
  21.        private int _numero;
  22.        public int numero
  23.        {
  24.            get
  25.            {
  26.                return _numero;
  27.            }
  28.  
  29.            set
  30.            {
  31.                _numero = value;
  32.                if (evento != null)
  33.                     evento(_numero, value);
  34.            }
  35.        }
  36.    }
  37.  

Algo por el estilo :)


Título: Re: [Solucionado][Duda][C#]Eventos y delegados
Publicado por: final_frontier en 17 Agosto 2010, 14:54 pm
Código
  1. if (evento == null)
  2.          evento(_numero, value);

La cagaste levemente creo xD


Título: Re: [Solucionado][Duda][C#]Eventos y delegados
Publicado por: [D4N93R] en 17 Agosto 2010, 14:55 pm
AHh si xD eso pasa cuando copias y pegas código de los demás xD
 Ya lo arreglé!