Callback em C#
Bom dia, pessoal.
Meu nome é João Paulo França e sou desenvolvedor .NET.
Hoje no meu primeiro post gostaria de compartilhar como podemos ter o comportamento de callback no C#. Muito comum e facilmente implementável/conhecido em Javascript, temos algumas alternativas em C# porém neste post vou abordar sobre o tipo Delegate
Mas antes... Vamos a algumas definições.
CALLBACK
Em poucas palavras, é um argumento de uma função/método que referencia um código executável (outra função/método).
Exemplo
Função que imprime um número formatadinho:
function imprimirNumeroFormatado(numero){
console.log("Número: "+numero+".");
}
Função que calcula dois números e usa um CALLBACK para imprimir o resultado
function calcular(valorA, valorB, callbackImprimir){
var resultadoCalculo = (valorA + valorB);
callbackImprimir(numero);
}
Exemplo de uso das funções
calcular(4, 4, imprimirNumeroFormatado);
O resultado seria
"Número: 8"
Agora que sabemos um pouco sobre a definição do que é callback, vamos falar da alternativa escolhida: o Delegate.
Delegates
O delegate é um tipo em C#. Assim como podemos criar classes, interfaces, structs, etc. Em C# também podemos contar com os tipos Delegates. Esses tipos nada mais são do que representações de códigos executáveis em um tipo. Te remeteu a deinição de callback também? Massa, né?
Então, diferente de uma função Javascript, os delegates do C# precisam ter as definições de tipos de retorno.
Exemplo de declaração de um delegate:
public delegate int Calcular(int numeroA, int numeroB);
Se tu já és familiarizado com as assinaturas do C#, vai perceber que o que muda da definição de contratos de uma interface é a adição da palavra reservada 'delegate' depois do modificador de acesso do método.
Seguindo o mesmo exemplo que o dado em Javascript, vamos fazer as mesmas operações só que agora com delegates.
Definicão do Delegate:
public delegate void FormatadorNumero(decimal numero);
Função que imprime um número formatadinho:
public static void ImprimirNumeroFormatado(decimal numero)
{
Console.WriteLine($"Número:{numero}.");
}
Função que calcula dois números e usa um CALLBACK para imprimir o resultado
static void Calcular(decimal numeroA, decimal numeroB, FormatadorNumero callback)
{
decimal resultadoCalculo = numeroA + numeroB;
callback(resultadoCalculo);
}
Exemplo de uso das funções
FormatadorNumero formatador = ImprimirNumeroFormatado;
Calcular(4, 4, formatador);
O resultado será o mesmo do Javascript
"Número: 8"
Em C# temos outras variações do uso do tipo Delegate assim como outros tipos mais específicos para podermos implementar um callback em nossa lógica.
Action, Func e EventHandlers são outras alternativas conhecidas que utilizam o delegate como base. Fica o convite para estudar sobre essas outras alternativas!
Espero que tenha contribuido com o conhecimento. Feliz 2023!
Fontes
Callback:
https://en.wikipedia.org/wiki/Callback_(computer_programming)
https://www.w3schools.com/js/js_callback.asp
Delegate C#:
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/
Contato:
https://jpdotfranca.github.io/