Autor do conceito comissionado: Liang Binyu Extraído de "C# Beginner Classroom" será publicado em breve
[email protected]
http://www.cnblogs.com/BeginnerClassroom
Às vezes precisamos usar uma função como parâmetro de outra função, então precisamos usar o mecanismo de delegação. Delegação é um conceito difícil de explicar com clareza. O autor pensou muito durante vários dias e finalmente encontrou um exemplo engenhoso.
A seguir, projetamos uma função de performance de circo RunCircus(). Seu primeiro parâmetro é uma função que representa um animal qualquer que seja passado para ela, a performance desse animal será executada. Crie um novo projeto chamado "Delegate" e adicione o seguinte código.
Experimente: Definindo delegados
//"Sala de aula C# para iniciantes"
//Função: exposição de cães
estático vazio DogAct(nome da string)
{
Console.WriteLine("Olá, eu sou " + nome + "!");
Console.WriteLine(@"
.----.
_.'__ `.
.--(#)(##)---/#
.' @ /###
: , #####
`-..__.-' _.-###/
`;_: `''
.''''''''`.
/,Snoopy,
// LEGAL! \
`-._______.-'
___`.
(______|______)");
}
//Função: show de gatos
vazio estático CatAct (nome da string)
{
Console.WriteLine("Olá, eu sou " + nome + "!");
Console.WriteLine(@"
.-.
|` / |
/ '.()--
|'._/
_|
= '-' /=
'-._____.-'
/`/___/`
//o/
(_| |_)
|____,____|
(____|____)");
}
//Função: show de leão
vazio estático LionAct (nome da string)
{
Console.WriteLine("Olá, eu sou " + nome + "!");
Console.WriteLine(@"
,%%%%%%%%,
,%%/%%%%/%%
,%%%c ""J/%%%
%%%%/o %%%.
`%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( /`%%%%%%%'
\ .'
\ / |
\/ ) |
/_ |__
(____________)))))))");
}
//define o delegado
delegado void AnimalAct(string nome);
//Função: performance de circo (o primeiro parâmetro é o delegado do tipo AnimalAct)
static void RunCircus (AnimalAct animalAct, nome da string)
{
animalAct(nome);
}
vazio estático principal(string[] args)
{
//Converte a função DogAct() para delegado do tipo AnimalAct
AnimalAct deleDogAct = new AnimalAct(DogAct);
//Passa o delegado deleDogAct para a função RunCircus()
RunCircus(deleDogAct, "Snoopy");
//Converte a função CatAct() em um delegado do tipo AnimalAct e passa para a função RunCircus()
RunCircus(new AnimalAct(CatAct), "Kitty");
}
Os resultados da execução são os seguintes:
"Aula C# para iniciantes"
O primeiro parâmetro da função RunCircus(AnimalAct animalAct, string name) é na verdade uma função que representa um animal. Que tipo de função é passada para ela usará que tipo de animal executar. Mas para realizar uma verificação estrita de tipo, não podemos passar diretamente o nome da função para ela, mas devemos primeiro definir um delegado (Dlelegate), ou seja, definir um "tipo de função".
O delegado é declarado com a palavra-chave delegado A instrução acima define um delegado (tipo de função) chamado AnimalAct, que especifica claramente o tipo de parâmetro do delegado e o tipo de valor de retorno. Quando precisamos usar uma função como parâmetro, devemos primeiro convertê-la em uma instância delegada.
Essa instância delegada é então passada como parâmetro para a função que a chama.
Pode-se ver que a instância delegada deleDogAct é na verdade um alias da função DogAct(). Obviamente, o delegado e a função delegada devem ter o mesmo tipo de parâmetro e tipo de retorno.
Em nosso programa, o circo sempre chama a função RunCircus() para executar. Ao definir a função RunCircus(), não sabemos nem nos importamos com qual função o delegado passado para ela representa. Esta função não é materializada até que a função RunCircus() seja chamada e os parâmetros reais sejam passados para ela. Quaisquer que sejam os parâmetros reais passados para ele, a performance será executada. Se você passar a delegação deleDogAct, o circo fará uma performance de cachorro; se você passar uma delegação deleCatAct, o circo fará uma performance de gato; uma delegação deleLionAct, o circo fará uma apresentação de gatos. O circo fez um show de leões. Portanto, funções que utilizam delegados como parâmetros têm certa generalidade.