elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [Tutorial] Delegados en .Net (C#)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Tutorial] Delegados en .Net (C#)  (Leído 7,432 veces)
[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
[Tutorial] Delegados en .Net (C#)
« en: 30 Julio 2010, 17:47 pm »

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
  1. public int Sum(int a, int b)
  2. {
  3.     return a + b;
  4. }


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

Código
  1. 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
  1. public void main(string[] args)
  2. {
  3.     // instanciamos y apuntamos al método Sum.
  4.     SumDelegate sd = new SumDelegate(Sum);
  5.  
  6.     //llamamos al delegado y como éste está apuntando
  7.      //a Sum, lo ejectuta y retorna el resultado.
  8.     int result = sd(2,3); // result es igual a 5
  9. }

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
  1. //esta es la clase donde está el evento
  2. public class Person
  3. {
  4.     //Definimos el evento usando el Delegado EventHandler
  5.     //EventHandler es un delegado bastante usado para eventos que
  6.     //no necesiten pasar datos hacia los parámetros del método suscrito
  7.     public event EventHandler NameChanged;
  8.     public string m_name;
  9.  
  10.     public string Name
  11.     {
  12.          get { return m_name; }
  13.          set
  14.          {
  15.                //Si el nombre cambia:
  16.                if(value != name)
  17.               {              
  18.                   m_name = value;
  19.                   //Si no hay suscripciones a NameChanged éste queda null
  20.                   //entonces si no es null podemos invocarlo.
  21.                   if(NameChanged != null)
  22.                       NameChanged(this, EventArgs.Empty);
  23.                 }
  24.           }
  25.     }
  26. }
  27.  
  28. //esta es la clase donde está suscrito el evento
  29. public class TestClass
  30. {
  31.     public void Test()
  32.     {
  33.          Person p = new Person();
  34.          p. Name =”Pepe”;   // no se ejecuta el evento
  35.          p.NameChanged += new EventHandler(Person_NameChanged);
  36.          p.Name = “Juan”; // ya estamos suscritos y se ejecuta el NameChanged
  37.      }
  38.      prívate void Person_NameChanged(object sender, EventArgs e)
  39.      {
  40.          //Aki hacemos algo cuando cambie el nombre de person.
  41.      }
  42. }

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
  1. public class NameChangedEventArgs : EventArgs
  2. {
  3.       private string m_newName;
  4.       public string NewName
  5.       {
  6.               get { return m_newName; }
  7.       }
  8. }

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
  1. 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!


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Delegados Generales [Aporte]
.NET (C#, VB.NET, ASP)
Keyen Night 0 1,633 Último mensaje 19 Febrero 2012, 22:59 pm
por Keyen Night
Los controles de la class principal no se actualizan con delegados... :-/
.NET (C#, VB.NET, ASP)
Eleкtro 7 3,549 Último mensaje 21 Diciembre 2012, 07:11 am
por Eleкtro
Ayuda con delegados y objetos [C#] « 1 2 »
.NET (C#, VB.NET, ASP)
Vaagish 10 5,744 Último mensaje 24 Mayo 2014, 21:10 pm
por samuelhm
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines