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 ?
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 ?
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...