Autor del concepto encargado: Liang Binyu Extraído de "C# Beginner Classroom" se publicará pronto
[email protected]
http://www.cnblogs.com/BeginnerClassroom
A veces necesitamos usar una función como parámetro de otra función, luego necesitamos usar el mecanismo de delegado. La delegación es un concepto difícil de explicar con claridad. El autor pensó mucho durante varios días y finalmente se le ocurrió un ejemplo ingenioso.
A continuación, diseñamos una función de actuación de circo RunCircus(). Su primer parámetro es una función que representa un animal. Cualquiera que sea el animal que se le pase, se realizará la actuación de ese animal. Cree un nuevo proyecto llamado "Delegar" y agregue el siguiente código.
Pruébelo: Definir delegados
//"Aula para principiantes de C#"
//Función: exposición canina
DogAct vacío estático (nombre de cadena)
{
Console.WriteLine("Hola, soy " + nombre + "!");
Consola.WriteLine(@"
.----.
_.'__ `.
.--(#)(##)---/#
.' @ /###
: , #####
`-..__.-' _.-###/
`;_: `''
.''''''''`.
/,Snoopy,
// ¡FRESCO! \
`-._______.-'
___`.
(______|______)");
}
//Función: exposición de gatos
CatAct vacío estático (nombre de cadena)
{
Console.WriteLine("Hola, soy " + nombre + "!");
Consola.WriteLine(@"
.-.__ _ .-.
|
/ '.()--
| '._/
_|
= '-' /=
'-._____.-'
/`/___/`
//o o/
(_| |_)
|____,____|
(____|____)");
}
//Función: espectáculo de leones
LionAct vacío estático (nombre de cadena)
{
Console.WriteLine("Hola, soy " + nombre + "!");
Consola.WriteLine(@"
,%%%%%%%%,
,%%/%%%%/%%
,%%%c "" J/%%%
% %%%%/ o o %%%
`%%%.
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( / `%%%%%%%'
\ .' |
\ / |
\/ ) |
/_ | |__
(____________)))))))");
}
//definir delegado
delegado void AnimalAct (nombre de cadena);
// Función: actuación de circo (el primer parámetro es el delegado de tipo AnimalAct)
vacío estático RunCircus (AnimalAct animalAct, nombre de cadena)
{
animalAct(nombre);
}
vacío estático principal (cadena [] argumentos)
{
//Convierte la función DogAct() en delegado de tipo AnimalAct
AnimalAct deleDogAct = new AnimalAct(DogAct);
//Pasar el delegado deleDogAct a la función RunCircus()
RunCircus(deleDogAct, "Snoopy");
//Convierte la función CatAct() en un delegado de tipo AnimalAct y lo pasa a la función RunCircus()
RunCircus(nueva AnimalAct(CatAct), " Kitty ");
}
Los resultados de ejecución son los siguientes:
"Clase para principiantes de C#"
El primer parámetro de la función RunCircus (AnimalAct animalAct, nombre de cadena) es en realidad una función que representa un animal. Qué tipo de función se le pasa y qué tipo de animal realizará. Pero para realizar una verificación de tipo estricta, no podemos pasarle directamente el nombre de la función, sino que primero debemos definir un delegado (Dlelegate), es decir, definir un "tipo de función".
El delegado se declara con la palabra clave delegado. La declaración anterior define un delegado (tipo de función) llamado AnimalAct, que especifica claramente el tipo de parámetro del delegado y el tipo de valor de retorno. Cuando necesitamos usar una función como parámetro, primero debemos convertirla en una instancia delegada.
Luego, esta instancia delegada se pasa como parámetro a la función que la llama.
Se puede ver que la instancia delegada deleDogAct es en realidad un alias de la función DogAct (). Obviamente, el delegado y la función delegada deben tener el mismo tipo de parámetro y tipo de retorno.
En nuestro programa, el circo siempre llama a la función RunCircus() para realizarla. Al definir la función RunCircus(), no sabemos ni nos importa qué función representa el delegado que le pasó. Esta función no se materializa hasta que se llama a la función RunCircus() y se le pasan los parámetros reales. Cualesquiera que sean los parámetros reales que se le pasen, se realizará la actuación. Si le pasa la delegación deleDogAct, el circo realizará una actuación de perro; si le pasa una delegación deleCatAct, el circo realizará una actuación de gato; Una delegación deleLionAct, el circo realizará una actuación de gatos. El circo realizará un espectáculo de leones. Por tanto, las funciones que toman delegados como parámetros tienen cierta generalidad.