Conceitos: Como chamar um Delegate

Como chamar um Delegate? Questões sobre delegates são incomuns em provas para candidatos iniciantes, aparecem com alguma frequência em vagas para profissionais plenos e é “figurinha carimbada” na maioria das provas para seniores.

Entretanto, nem sempre é uma pergunta difícil. Para acertar a questão abaixo, o candidato precisa apenas conhecimentos básicos sobre o assunto.

Qual(ais) da(s) próximas alternativas substitui(em) ***** na função main fazendo com que o programa retorne o valor 15?

using System;

namespace Program {
   class Program {
      static void Main(string[] args) {
         int result;

         *****

         Console.WriteLine(result);
      }

      static int Add(int a, int b) {
         return a + b;
      }

      static int DoIntMath(Func<int,int,int> function, int x, int y) {
         return function(x, y);
      }    
   }
}

A. result = DoIntMath(new delegate int(int a, int b){ return a + b; }, 5, 10);
B. result = DoIntMath(Add, 5, 10);
C. result = DoIntMath((a, b) => (a + b),  5,  10);
D. result = DoIntMath(delegate (int a, int b){ return a + b; }, 5, 10);
E. result = DoIntMath(Add(5, 10));

Mas o que é um delegate?

Um delegate é um tipo que permite fazer referência para um método com uma lista de parâmetros e um tipo de retorno específico. Ou seja, é um ponteiro que pode ser associado a qualquer método com uma assinatura e tipo de retorno compatíveis.

A função DoIntMath

static int DoIntMath(Func <int, int, int> function, int x, int y)

… possui três parâmetros. Os dois últimos (x e y ) são parâmetros inteiros comuns, já o primeiro (function) é uma função que retorna um número inteiro e recebe dois parâmetros também inteiros: Func< retorno, parâmetro 1, parâmetro 2>.

A função function aceita qualquer coisa com o formato int(parâmetro int, parâmetro int). Em outras palavras, para invocar a função DoIntMath, é preciso passar uma função semelhante à int Add(int a, int b), o que já elimina a alternativa “E”. A alternativa “A” também pode ser facilmente eliminada por causa da palavra new, uma vez que não se instancia um delegate.

Com isto, restam como corretas as alternativas “B”, onde é passada uma função já existente (Add) e as alternativas “C” e “D”, onde são passadas novas funções que foram declaradas diretamente no parâmetro function.

Origem da questão
País: Holanda Tipo: Conceitos Assunto: Delegate
Ramo de negócio da empresa: Consultoria Grau de Dificuldade: Médio