Translate

viernes, 30 de abril de 2021

Delegate en C#


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. Veamos un ejemplo: 


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);

  }

}


Como podemos instanciar delegados? Tenemos diferentes maneras: 

  1. Constructor:  MiDelegado delegado = new MiDelegado(miClase.MiMetodo);
  2. Directamente con asignación:  MiDelegado delegado = miClase.MiMetodo;
  3. Anonymous methods: MiDelegado delegado = delegate(int i) { Console.WriteLine("El valor pasado como parámetro es: {0}", i); };
  4. Y lambda expressions: MiDelegado delegado = x => { Console.WriteLine("El valor pasado como parámetro es: {0}", x); };

La verdad no entiendo muy bien, la ventaja y desventaja ante clausuras o lambdas. Voy a tener que seguir leyendo. 

Dejo link: https://www.tutorialsteacher.com/csharp/csharp-delegates