Introducción
En nuestras aplicaciones a veces necesitamos que al realizar una acción (sea un clic sobre un botón, o al cargar una pagina Web) se ejecute una parte del código de la aplicación de manera transparente. Este primer tutorial de eventos vamos a tratar el tema de Delegados en .net como parte del manejo de eventos.
En .net el manejo de eventos se realiza por medio de la definición de un tipo especial de subclase que se le conoce como delegado. Estas clases pueden contener referencias de uno o más métodos de tal manera que a través del objeto sea posible solicitar ejecución en cadena de todos ellos.
Delegados
Es un tipo especial de subclase (System.MulticastDelegate). Sin embargo, para definir estas clases no se puede utilizar el mecanismo de herencia normal, este tendrá una sintaxis especial. Estas clases especiales contienen métodos y propiedades de otros objetos, y permiten hacer colecciones de estos métodos.
<private/public/protected> delegate <tipoRetorno> <nombreDelegado> (<parámetros>);
Un Ejemplo de esto seria
public delegate int randomNumber(int seed);
Las clases delegadas solo pueden contener métodos que cumplan con los mismos valores de retorno y parámetros que las clases delegadas. Un ejemplo de esto seria:
using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespace PrimerEjemploDelegado { public delegate void sayHello(); public delegate String getHelloWorld(); public delegate void sayHelloMore(); class Program { static void Main(string[] args) { try { Type t = typeof(Program); MethodInfo m = t.GetMethod("sayHelloMethod"); sayHello sayHello = (sayHello)Delegate.CreateDelegate(typeof(sayHello), m); sayHello.Invoke(); } catch (Exception ex) { System.Console.WriteLine(ex.Message); } finally { System.Console.ReadKey(); } } public static void sayHelloMethod() { System.Console.WriteLine("hola"); } public static String getHello() { return "hola"; } public static void sayHelloMore(String msj) { System.Console.WriteLine("hola "+msj); } } }
Como vemos si cambiamos esta linea MethodInfo m = t.GetMethod(”sayHelloMethod”); por cualquier de los otros metodos el programa nos lanzara una excepcion ya que los otros metodos reciben parametros diferentes y retornan valores.
Otra forma de realizar una asignacion de un metodo delegado seria algo asi.
using System; using System.Collections.Generic; using System.Text; namespace SegundoEjemploDelegado { class Program { public delegate int Suma(int a, int b); private static Suma suma; public static Suma SumaObj { get { return suma; } set { suma = value; } } static void Main(string[] args) { ObjetoConUnMetodo b = new ObjetoConUnMetodo(); System.Console.WriteLine(Program.SumaObj(5,10)); Console.ReadKey(); } } class ObjetoConUnMetodo { public ObjetoConUnMetodo() { Program.SumaObj = new Program.Suma(Suma); } private int Suma(int c, int b) { return c + b; } } }
Como vemos el objeto “ObjectoConUnMetodo” es el encargado de registrar la implementacion de sumar al objecto delegado. Ahora vamos a intentar que el objeto delegado reciba n metodos y los llame sin que este se de cuenta. El codigo seria asi:
using System; using System.Collections.Generic; using System.Text; namespace TercerEjemploDelegado { class Program { public delegate void OperacionesBasicas(int a, int b); private static OperacionesBasicas operacion; public static OperacionesBasicas Operacion { get { return operacion; } set { operacion = value; } } static void Main(string[] args) { try { Implementacion a = new Implementacion(); Program.Operacion(20,5); Console.ReadKey(); } catch (Exception e) { Console.WriteLine(e.Message); } } } public class Implementacion { public Implementacion() { Program.Operacion += new Program.OperacionesBasicas(Suma); Program.Operacion += new Program.OperacionesBasicas(Resta); Program.Operacion += new Program.OperacionesBasicas(Multiplicacion); Program.Operacion += new Program.OperacionesBasicas(Division); } private void Suma(int a, int b) { System.Console.WriteLine("Yo estoy sumando {0} y {1} y el resultado es {2}", a, b, a + b); } private void Resta(int a, int b) { System.Console.WriteLine("Yo estoy restando {0} y {1} y el resultado es {2}", a, b, a - b); } private void Multiplicacion(int a, int b) { System.Console.WriteLine("Yo estoy multiplicacion {0} y {1} y el resultado es {2}", a, b, a * b); } private void Division(int a, int b) { System.Console.WriteLine("Yo estoy division {0} y {1} y el resultado es {2}", a, b, a / b); } } }
Como vemos al usar el operador += podemos indicarle al metodo delegado que va a contener mas metodos y cuando este se le llame nuestro objeto delegado va a llamar a todos los metodos contenidos










Sin comentarios a “I-Manejo de Eventos en C# (Clases Delegadas)”
Por favor espera
Deja una respuesta