3
respostas

duvida sobre o request delegate

fala ae pessoal , eu percebi que ainda possuo uma duvida sobre o requeste delegate, qual a diferença dele para um delegate normal ?outra coisa , pq devo utilizar o metodo invoke com o contexto como parametro , ao inves de somente retornar ?

3 respostas

Luan, bom dia.

Primeiro deixa explicar o que é delegate.

Imagine que quiséssemos ter uma variável para guardar uma referência para um método. Você pode estar se perguntando qual objetivo eu iria querer isso. O motivo é simples: porque não sei em que momento ele será executado! Por exemplo: quero disparar o método apenas quando o usuário clicar em um botão. O usuário pode nunca clicar nele, mas quando clicar o método será executado, ou melhor: invocado (opa, apareceu aí o Invoke()).

Continuando, lembre-se que uma variável para ser declarada precisa de 2 coisas: 1 nome e a definição de seu tipo. Exemplo de declarações de variáveis:

int idade;
double preco;
Pessoa cliente;
DateTime nascimento;

Então se quiséssemos declarar uma variável para guardar um método eu precisaria saber qual tipo ela teria. Toda variável que guarda um método é do tipo delegate. Um delegate é um tipo que representa um grupo de métodos com uma assinatura específica. Veja o exemplo:

public int SomaDoisNumeros(int n1, int n2)
{
    return n1 + n2;
}

public int SubtraiDoisNumeros(int n1, int n2)
{
    return n1 - n2;
}

public int MultiplicaDoisNumeros(int n1, int n2)
{
    return n1 * n2;
}

Pergunto: o que eles têm em comum? Pare um pouco e tente responder antes de continuar a leitura.

A reposta é o tipo do retorno (int) e os tipos e quantidades de argumentos(2 argumentos, também do tipo int). Então eu posso criar um tipo que representa qualquer método com essas características em comum.

delegate int OperacaoComDoisNumeros(int primeiroNumero, int segundoNumero);

Nesse exemplo acima o nome do tipo é OperacaoComDoisNumeros. E aí consigo finalmente declarar uma variável que guarda esses métodos:

OperacaoComDoisNumeros metodo;

E qualquer das atribuições abaixo será válida:

OperacaoComDoisNumeros metodo = SomaDoisNumeros;
OperacaoComDoisNumeros metodo = SubtraiDoisNumeros;
OperacaoComDoisNumeros metodo = MultiplicaDoisNumeros;

Repare que não usei parênteses nas atribuições. Porque ainda não está na hora de executar o método, apenas guardar sua referência. Quando for a hora (por ex, no clique do botão) eu executo o método. Ou melhor, o invoco! Mas pra executar esse método eu preciso passar dois argumentos.

metodo.Invoke(1,2);

Acho que é isso. Espero que tenha entendido delegates e o porque de usar Invoke().

Se quiser uma explicação mais lúdica leia meu artigo no blog da Caelum.

Abraços!!

MUITO obrigado pela explicaçao , entao no exemplo da aula , quando é passado o contexto para o invoke, o que vc esta dizendo é : quando ocorre a requisiçao esta pagina, que a gente nao sabe quando , é isso ?

É isso mesmo, Luan! Aquele código (com o Invoke()) só é executado quando ocorre uma requisição para a página. Durante a inicialização da aplicação não sabemos quando uma requisição vai chegar...

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software