Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - [D4N93R]

#1031
Delegados en C#
Un delegado es un tipo que especifica un método a llamar, y opcionalmente una referencia a otro delegado. Normalmente se utilizan, aparte de otras cosas, para implementar callbacks y eventos. Entonces, en pocas palabras para los programadores de C++, podemos decir que un delegado es un puntero a un método.

Además, los delegados en .net permiten la ejecución asíncrona del método apuntado (Ver),  y también nos permiten obtener un arreglo de los delegados que está apuntando en cadena.



¿Cómo creo un delegado?

Supongamos que tenemos el siguiente método:

Código (csharp) [Seleccionar]
public int Sum(int a, int b)
{
     return a + b;
}


Entonces para crear un delegado tenemos que respetar tu firma y su tipo de retorno, quedaría así:

Código (csharp) [Seleccionar]
public delegate int SumDelegate(int a, int b);

Es practicamente un método pero sin cuerpo y con la palabra clave DELEGATE antes del tipo de retorno. Veamos un ejemplo de uso:

Código (csharp) [Seleccionar]
public void main(string[] args)
{
     // instanciamos y apuntamos al método Sum.
     SumDelegate sd = new SumDelegate(Sum);

     //llamamos al delegado y como éste está apuntando
      //a Sum, lo ejectuta y retorna el resultado.
     int result = sd(2,3); // result es igual a 5
}


Ahora veamos un uso importante de los delegados:

Los eventos

Un evento es una acción que se inicia fuera de contexto, es manejado en uno o más métodos del programa. Por ejemplo un evento iniciado por el usuario sería el Mouse Click, pero también hay eventos que son iniciados por otros objetos por ejemplo: Application.ThreadException para manejar las excepciones de la aplicación.

Algo que hay que tener en cuenta es que un evento es un delegado que nada más puede invocarse desde el contexto en donde se declaró. Esto quiere decir que una clase que tenga un evento, éste solamente puede llamarse desde dentro de la clase y no fuera de ésta.

Otra punto importante es que el delegado que usemos para definir el evento puede ser cualquiera, tanto uno que venga en el framework, como otro nuestro.

Ejemplo:

Código (csharp) [Seleccionar]
//esta es la clase donde está el evento
public class Person
{
     //Definimos el evento usando el Delegado EventHandler
     //EventHandler es un delegado bastante usado para eventos que
     //no necesiten pasar datos hacia los parámetros del método suscrito
     public event EventHandler NameChanged;
     public string m_name;

     public string Name
     {
          get { return m_name; }
          set
          {
                //Si el nombre cambia:
                if(value != name)
               {               
                   m_name = value;
                   //Si no hay suscripciones a NameChanged éste queda null
                   //entonces si no es null podemos invocarlo.
                   if(NameChanged != null)
                       NameChanged(this, EventArgs.Empty);
                 }
           }
     }
}

//esta es la clase donde está suscrito el evento
public class TestClass
{
     public void Test()
     {
          Person p = new Person();
          p. Name ="Pepe";   // no se ejecuta el evento
          p.NameChanged += new EventHandler(Person_NameChanged);
          p.Name = "Juan"; // ya estamos suscritos y se ejecuta el NameChanged
      }
      prívate void Person_NameChanged(object sender, EventArgs e)
      {
          //Aki hacemos algo cuando cambie el nombre de person.
      }
}


Siempre hay que mantener el uso del sender y el argumento.  En caso de que se quiera pasar data, simplemente en vez de colocar EventArgs, se coloca una clase que herede de ésta y se le ponen las propiedades necesarias.

Ejml:

Código (csharp) [Seleccionar]
public class NameChangedEventArgs : EventArgs
{
       private string m_newName;
       public string NewName
       {
               get { return m_newName; }
       }
}


Ahora quedan dos formas de utilizarlo, la primera es crear nuestro delegado y la segunda es utilizar al EventHandler genérico el cual vamos a hablarles en otra ocasión. Entonces vamos a definir nuestro delegado:

Código (csharp) [Seleccionar]
public delegate void NameChangedEventHandler(object sender, NameChangedEventArgs e);

El uso es idéntico al ejemplo anterior pero cambiamos EventHandler por NameChangedEventHandler.

Si se me olvida algo, me dicen y lo agrego, Un saludo!
#1032
Cita de: EvilGoblin en 30 Julio 2010, 17:28 PM
Cita de: Novlucker en 30 Julio 2010, 17:23 PM
No hay que linkear nada, simplemente registrar otra vez el usuario en freenode, con el MISMO nombre :P

Saludos


De hecho para ser mas dinamicos elhacker.net deberia disponer el canal (y host) de irc autonomo.. para al conectarte al foro y entrar al chat (http quizas) tome de la cookie la conexion y te registre y entres a canal de Irc con 1 solo click desde la web.

Seria como embeber un canal de IRC a elhacker.net :P

Yo dije algo parecido, pero hay que ver quien tiene ganas de hacerlo xD
#1033
@Azuelito: Me parece excelente tu idea, habrá que ver los temas, y la disponibilidad de la gente para ser el "host" en caso de ser necesario.

A mi una vez se me ocurrió que sería bueno que se hicieran web cast, podemos usar ustream o algo de eso, y complementarlo con el IRC, qué dicen de eso?

@Ariath: Si tienes más de 30 días sin autenticarte en freenode tu usuario se borra, tienes que crearlo de nuevo, aunque no si hará falta linkearlo a la cuenta, creo que no.

Un saludo!
#1034
XD Tranquilo, xD

Te recomiendo que te compres unas cuantas botellas de Coca-Cola hahaha
#1035
Si, yo utilizo XChat y todo eso lo hace automático, se conecta al server, se autentica , entra a dos canales, y comienzo a trollear. xD
#1036
Buen relato, xD

El problema de linux no es de linux, es de las casas de software que no sacan sus versiones para otras plataformas. La gente no usa el SO, la gente usa aplicaciones. En linux pueden haber muchas, y buenas como blender, pero blender no le va a llegar a Maya o Cinema4D por más bueno que sea.

Tampoco existe Visual Studio Para linux, por más bueno que sea SharpDevelp. Ni mucho menos Microsoft Office, que sigue siendo muchisimo más potente que Open office. Las grandes empresas de Video Juegos no sacan sus versiones para linux, esto es un gran problema también.

No digo que todo esto no vaya a cambiar en un futuro, pero la realidad es que no es así.

Un saludo!
#1037
Cita de: jdc en 30 Julio 2010, 07:37 AM
Error 404,5 Bianc4 en sus días

Ja ja ja

Si, posiblemente esté en sus días xD
#1038
Hehe, tranquilo que eso siempre pasa.

Ok, bueno, vas a tener que usar ambos, un subproceso que siempre esté pendiente del irc, lo mejor es que lo hagas en una clase que abstraiga el hecho de que hay un subproceso corriendo, esa clase tiene que tener un método Start o Connect, para comenzar la connection, además, antes de connectarte tienes que subscribirte a los métodos de la clase que son los que van a darte los resultados.

No es muy difícil, puedes tener un evento de DataReceived, o algo así, con un argumento en donde esté todo bien parseado sobre la data recibida. Por ejemplo, qué tipo de mensaje es, si es privado o no, de qué usuario proviene, todo eso,para así no estar parseando ni procesando la data en el formulario. Te suscribes a ese evento en el formulario y ya.

Luego un método para escribir al IRC, un método que te liste los usuarios, o los channels a los que estás unido, otro que traiga todos los channels del server,.

Hay mucho tema, pero comienza poco a poco y le vas añadiendo funcionalidades.

Si tienes dudas sobre Threading o sobre Delegados, hay temas en el foro, puedes buscar en google con algo así: site:elhacker.net Delegados OR Delegates

Un saludo!
#1039
Cómo que lea? Si lo que haces es guardar, estás escribiendo.

El streamWriter es para escribir (guardar) usa el StreamReader para leer ..


Un saludo!
#1040
Cita de: noenat en 30 Julio 2010, 03:16 AM
hola soy nueva en el foro y estoy muy interesada en el tema ya que estoy haciendo un proyecto con google mapas y vb.net
como puedo hacer para acceder al tutorial

Seba123neo va a ir armando el tuto en este post. Así que pásate por acá más seguido  hasta que publique todo.

Saludos