menú
¿Música de YouTube sin molestos comerciales? ¡Ahora es posible!
TubeFiesta es una aplicación que te permite reproducir música de YouTube como un reproductor tradicional.
Crear listas, reproducción aleatoria, repetir, y hasta exportar el video a otra pantalla.
Conocer más Ir a tfiesta.com

Delegados en C#, que son y como usarlos

Publicado el 20/11/2013 | 13225 visitas

Para muchas personas el termino delegados es tal vez muy conocido, pero muy poco practicado. Esto pasa mucho cuando utilizamos un trozo de código que encontramos en internet y nunca nos cuestionamos sobre el "porque funciona?".

Como buen fanático de la frase "conocer, comprender y luego hacer" me permito escribir esta entrada con la intención de explicar el concepto de los delegados en c# y su uso. comencemos:

Que es un delegado?

Un delegado es un tipo que define una firma de método y se puede asociar a cualquier método con una firma compatible. Puede invocar (o llamar) al método a través del delegado.

Así lo dicen los expertos en msdn, no sería raro que ya lo hayas leído en otra parte y sigues con la misma duda, así que vamos más allá de eso.

Lo importante es saber que un delegado me permite enviar un método como parámetro a otro método.

Vamos por partes...

Que es una firma de método?

Cuando se habla de una "firma de método" se hace referencia al tipo de retorno, número y tipos de parámetros del mismo. Veamos dos firmas de métodos diferentes:

public void MostrarMensaje(string mensaje, int cantidadVeces) { ... }
public string MostrarMensaje(string mensaje) { ... }

Son dos firmas de métodos diferentes porque el tipo de dato que retorna, la cantidad de parámetros y los tipos de parámetros son diferentes para cada método. (nota que el nombre de los métodos es el mismo).

Cuando se habla de "una firma compatible" quiere decir que el delegado debe tener la misma firma del método que va a invocar (llamar o implementar).

Como se declara un delegado?

Un delegado se declara igual que la firma de un método, sin cuerpo (osea, sin llaves) e interponiendo la palabra reservada delegate entre el modificador de acceso y el tipo de retorno de la firma. ejemplo:

public delegate void MostrarMensajeDelegado(string mensaje, int cantidadVeces);

Cada delegado debe tener un nombre diferente.

Ahora que tenemos declarados los delegados y los métodos debemos instanciarlos y luego invocarlos.

Cómo se utilizan los delegados?

Para utilizar un delegado lo primero que debes hacer es crear una instancia de él, indicándole el nombre del método que ejecutará; así:

MostrarMensajeDelegado miDelegado = 
    new MostrarMensajeDelegado(MostrarMensaje);

Observa que en el constructor del delegado enviamos el nombre (solo el nombre, sin parámetros) del método que se invocará.

Y ahora lo único que nos falta es invocar el delegado desde alguna parte; así:

miDelegado("hola mundo", 5);

Al llamar al delegado estarás invocando el método que diste como parámetro al instanciarlo.

Y porque no simplemente se llama el método directamente?

Es la misma pregunta que yo me hago, no le veo utilidad a los delegados... es broma!, vamos a ver porque:

Dicho antes, con un delegado puedes invocar cualquier método con la única condición de que la firma sea idéntica. El ejemplo más practico que puedo darte son los eventos. Cuando creas un evento onclick a un botón lo que haces es crear un método, y "decirle" al botón que cuando hagan clic en él, invoque dicho método. Cómo crees que lo hace?.

Otro ejemplo muy utilizado es cuando utilizas hilos (Threads) y desde un hilo necesitas utilizar un control de formulario (como un TextBox o un DataGridView), ya que esto no es permitido se deben utilizar dichos controles desde el mismo contexto de la interfaz gráfica haciendo la invocación del delegado a través de un control de formulario. así:

object[] parametros = new object[] { "hola mundo", 5};
this.textBox1.Invoke(miDelegado, parametros);

Y de esta manera invocarás el método en el mismo contexto (o mismo hilo) del TextBox.

Es todo amigos, espero que les sirva bastante y haya logrado el objetivo de esta entrada: explicar cómo que son y cómo utilizar los delegados en c#

Talvez te interese...

Tutorial de sockets en c# con ejemplos - Parte 2 - UDP
Tutorial de sockets en c# con ejemplos - Parte 1
[solución] No puede obtener acceso a la página solicitada debido a la configuración de la extensión
[solución] El proveedor de almacenamiento especificado no se encuentra en la configuración
blog comments powered by Disqus