[Solucionado][Duda][C#]Eventos y delegados

Iniciado por final_frontier, 16 Agosto 2010, 21:02 PM

0 Miembros y 1 Visitante están viendo este tema.

final_frontier

(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 (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NewEventClase
{
   class Program
   {
       static void Main(string[] args)
       {
           eventos obj = new eventos();
           int a = 3;
           obj.delegado(obj.numero, a);
           obj.numero = a;
           for (int i = 1; i < 10; i++)
               obj.numero = i;
           Console.ReadLine();
       }
   }

   class eventos
   {
       public eventos()
       {
           _numero = 0;
           delegado = new DatosHandlerEvent(danumero);
       }

       private void danumero(int a, int b)
       {
           if(a!=b)
               Console.WriteLine("Evento");
       }

       public delegate void DatosHandlerEvent(int a, int b);
       public event DatosHandlerEvent evento;
       public DatosHandlerEvent delegado;

       private int _numero;
       public int numero
       {
           get
           {
               return _numero;
           }

           set
           {
               _numero = value;
               if (evento != null)
               {
                   evento(value, _numero);
               }
           }
       }
   }
}


¿Por qué no se ejecuta el evento en ese bucle del main?¿Qué tengo mal y como lo remedio?
Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...

[D4N93R]

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 (csharp) [Seleccionar]

                _numero = value;
                if (evento != null)
                {
                    evento(value, _numero);
                }


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 (csharp) [Seleccionar]
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


final_frontier

: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 (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NewEventClase
{
    class Program
    {
        static void Main(string[] args)
        {
            eventos obj = new eventos();
            obj.numero = 0;
            for (int i = 1; i < 10; i++)
                obj.numero = i;
            Console.ReadLine();
        }
    }

    class eventos
    {
        public eventos()
        {
            _numero = 0;
            delegado = new DatosHandlerEvent(danumero);
        }

        private void danumero(int a, int b)
        {
            if (a != b)
                Console.WriteLine("Evento");

            else
                Console.WriteLine("Lolazo");
        }

        public delegate void DatosHandlerEvent(int a, int b);
        public event DatosHandlerEvent evento;
        public DatosHandlerEvent delegado;

        private int _numero;
        public int numero
        {
            get
            {
                return _numero;
            }

            set
            {
                if (evento == null)
                {
                    evento += new DatosHandlerEvent(danumero);
                }

                evento(_numero, value);
                _numero = value;
               
            }
        }
    }
}
Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...

[D4N93R]

#3
Ahmm, Final, así no es :D es algo así:

Código (csharp) [Seleccionar]

class eventos
   {
       public eventos()
       {
           _numero = 0;
            evento += new DatosHandlerEvent(danumero);
       }

       private void danumero(int a, int b)
       {
           if (a != b)
               Console.WriteLine("Evento");

           else
               Console.WriteLine("Lolazo");
       }

       public delegate void DatosHandlerEvent(int a, int b);
       public event DatosHandlerEvent evento;

       private int _numero;
       public int numero
       {
           get
           {
               return _numero;
           }

           set
           {
               _numero = value;
               if (evento != null)
                    evento(_numero, value);
           }
       }
   }


Algo por el estilo :)

final_frontier

Código (csharp) [Seleccionar]
if (evento == null)
          evento(_numero, value);


La cagaste levemente creo xD
Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...

[D4N93R]

AHh si xD eso pasa cuando copias y pegas código de los demás xD
Ya lo arreglé!