(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...
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?
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:
_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:
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
: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.
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;
}
}
}
}
Ahmm, Final, así no es :D es algo así:
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 :)
if (evento == null)
evento(_numero, value);
La cagaste levemente creo xD
AHh si xD eso pasa cuando copias y pegas código de los demás xD
Ya lo arreglé!