[.NET] Qué es un Delegate y su implementación en C# (I).


En el siguiente post veremos la definición de un delegate y cómo se implementa en C#, qué características tienen y las diferentes maneras que existen de instanciarlos.

¿Qué es un delegate?

Un delegate es un tipo que representa referencias a métodos con una lista de parámetros determinada y un tipo de valor devuelto. Es la versión de .NET de los punteros a función de C++ pero con seguridad de tipos (type-safe), es decir, se comprueban los tipos de retorno y de los parámetros del mismo. La clase de delegado no sólo contiene una referencia a un método, también puede mantener referencias a varios métodos mientras cumplan con la firma definida.

Los delegados se utilizan para pasar métodos como argumentos a otros métodos. Indicar que los manejadores de eventos no son más que métodos que se invocan a través de delegados.

Las propiedades de los delegados son las siguientes:

  • Los delegados son como los punteros de función de C++, pero tienen seguridad de tipos.
  • Los delegados permiten pasar los métodos como parámetros.
  • Los delegados pueden usarse para definir métodos callback.
  • Los delegados pueden encadenarse entre sí; por ejemplo, se puede llamar a varios métodos en un solo evento.
  • No es necesario que los métodos coincidan exactamente con el tipo de delegado.

El siguiente código es un ejemplo de la declaración de un delegado con un parámetro de tipo int y un tipo de retorno también de tipo int.

public delegate int MiDelegado(int i);

También se permite declarar delegados empleando generics:

delegate TResult MiDelegadoGenerico<out TResult>();

Un ejemplo de uso de un delegate

Vamos a ver un pequeño trozo de código en el que se muestra la declaración y uso de un delegado. El código es autoexplicativo por lo que no me extenderé mucho

using System;

public delegate void MiDelegado(int i); 
 
public class Test
{
  public static void Main()
  {
    MiClase miClase = new MiClase();
   
    // instanciamos un delegado. Observa que el método MiMetodo de la clase 
    // MiClase cumple con la firma definida en el delegado
    MiDelegado delegado = new MiDelegado(miClase.MiMetodo);
    delegado(83); // Se hace la llamada al delegado
  }
}
 
public class MiClase
{
  public void MiMetodo(int i)
  {
    Console.WriteLine("El valor pasado como parámetro es: {0}", i);
  }
}

¿De qué maneras se puede instanciar un delegate?

Existen varias formas de instanciar un delegado.

  • Ya hemos visto la forma más básica que es la de pasar al constructor del delegado el método que cumple con la firma.
MiDelegado delegado = new MiDelegado(miClase.MiMetodo);
  • Se puede establecer directamente a través del nombre del método que va a manejar el delegado y que cumple con la firma definida en la declaración, en el anterior ejemplo sería así:
MiDelegado delegado = miClase.MiMetodo;
    • Empleando los anonymous methods, que son básicamente una forma de pasar un bloque de código como parámetro de delegado y declarar un método sin darle un nombre. Los anonymous methods sólo pueden ser creados cuando se usan en delegados, de hecho, se crean usando la palabra clave delegate. Siguiendo nuestro ejemplo la declaración del delegado sería:
MiDelegado delegado = delegate(int i) { Console.WriteLine("El valor pasado como parámetro es: {0}", i); };
  • Empleando las lambda expressions, introducidas a partir de la versión 3.0 del .NET Framework con la inclusión de LINQ (Language-Integrated Query). Según la definición de MSDN: “Una expresión lambda es una función anónima que se puede usar para crear tipos delegados o de árbol de expresión. Utilizando expresiones lambda, puede escribir funciones locales que se pueden pasar como argumentos o devolverse como valor de llamadas a funciones. Las expresiones lambda son especialmente útiles para escribir expresiones de consulta LINQ (Language-Integrated Query)”. Por lo que nuestro ejemplo quedaría de la siguiente forma:
MiDelegado delegado = x => { Console.WriteLine("El valor pasado como parámetro es: {0}", x); };

Ya hemos aprendido qué son los delegados y las diferentes maneras que existen de instanciarlos. En el siguiente post veremos qué son los Multicast delegate y cómo agregar o eliminar métodos de un delegado.

Anuncios

Un comentario en “[.NET] Qué es un Delegate y su implementación en C# (I).

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s