Devolución de llamada en C#

Bilal Shahid 12 octubre 2023
  1. ¿Qué es una devolución de llamada en C#?
  2. Usar delegados en C#
Devolución de llamada en C#

Hoy veremos qué es una devolución de llamada en C# y luego revisaremos un código para entender cómo funciona.

¿Qué es una devolución de llamada en C#?

Una devolución de llamada se refiere a algún código pasado como argumento a otro bloque de código que lo ejecuta más tarde. Dos de sus tipos incluyen; devoluciones de llamadas síncronas (inmediatas) y asíncronas (retrasadas).

Las devoluciones de llamada sincrónicas funcionan de inmediato, lo que significa que ocurren tan pronto como se invoca la función. Las devoluciones de llamada asincrónicas (diferidas) a menudo ocurren una vez que la función regresa.

Como habrás adivinado, funciona para operaciones de E/S que tienden a invocar esta función una vez que ocurre algún evento específico.

En C#, usamos algo conocido como delegados, que son punteros de función y se pueden usar como devoluciones de llamada.

Entonces, puede definir un método que tome una función como parámetro, y este método luego tiende a devolver la llamada a la función con un mensaje o algo que quiere devolverle. Echemos un vistazo a un ejemplo a continuación.

using System;

public class A {
  static void Main(String[] args) {
    B func = new B();
    func.send_back(callbackMethod);
  }

  static void callbackMethod(int number) {
    Console.WriteLine("The number is: " + number);
  }
}
public class B {
  public void send_back(Action<int> Callback) {
    Callback(4);
  }
}

Así que hemos hecho dos clases; “A y B”. A tiene definida la función Main e instancia un objeto de clase B.

En B, hemos creado un método que toma la función como parámetro y luego invoca esa función. Así que se llama a func con la función, y luego B llama a la función con el parámetro 4, que imprime este número.

Producción :

The number is: 4

El delegado en el ejemplo anterior es la función: send_back(). El evento es la llamada de send_back() y la devolución de llamada es la función que se invoca dentro del método send_back: callbackMethod().

Ya hemos llamado a esa función devolución de llamada dentro del método B.

Usar delegados en C#

Un delegado tiende a apuntar a un método que coincide con sus firmas y puede llamar a esa función con o sin los parámetros definidos en ambos. Entonces, por ejemplo, podemos decir que teníamos las dos funciones, send_back() y callbackMethod(), y queremos que una sea el delegado.

El callbackMethod() es el delegado. Así que podemos escribir un código de la siguiente manera.

using System;

public delegate void send_back(int num);

public class B {
 public void send_back(Action<int> Callback) {
   Callback(4);
 }
}

public class Program {
 static void Main(String[] args) {
   B func = new B();
   send_back handle = callbackMethod;
   handle(4);
 }

 static void callbackMethod(int number) {
   Console.WriteLine("The number is: " + number);
 }
}

El delegado es send_back que se instancia mediante un controlador que apunta al método y luego llama al método con los parámetros correctos. Puede notar que handle(4) es igual a callbackMethod(4).

Esto también parece muy similar a las funciones Lambda. El código completo se muestra a continuación.

using System;

class classer {
  public class A {
    // DELEGATE METHOD
    public delegate void send_back(int num);

    static void Main(String[] args) {
      B func = new B();
      send_back handle = callbackMethod;
      handle(4);
    }

    static void callbackMethod(int number) {
      Console.WriteLine("The number is: " + number);
    }
  }
  // THE CLASS B (THE FIRST CALLBACK METHOD)
  public class B {
    public void send_back(Action<int> Callback) {
      Callback(4);
    }
  }
}
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub