Автор концепции: Лян Бинью. Отрывок из «Класса для начинающих по C#» скоро будет опубликован.
НовичокКласс@163.com
http://www.cnblogs.com/BeginnerClassroom
Иногда нам нужно использовать функцию в качестве параметра другой функции, тогда нам нужно использовать механизм делегирования. Делегирование — это сложная концепция для ясного объяснения. Автор несколько дней думал и наконец придумал гениальный пример.
Далее мы создаем функцию циркового представления RunCircus(). Ее первый параметр — это функция, представляющая животное. Какое бы животное ему ни было передано, представление этого животного будет выполнено. Создайте новый проект с именем «Делегировать» и добавьте следующий код.
Попробуйте: определение делегатов
//"Класс для начинающих по C#"
//Функция: выставка собак
static void DogAct(имя строки)
{
Console.WriteLine("Привет, я " + имя + "!");
Console.WriteLine(@"
.----.
_.'__ `.
.--(#)(##)---/#
.' @ /###
: , #####
`-..__.-' _.-###/
`;_: `''
.''''''''`.
/,Снупи,
// ПРОХЛАДНЫЙ! \
`-._______.-'
___`.'___
(______|______)");
}
//Функция: выставка кошек
static void CatAct(имя строки)
{
Console.WriteLine("Привет, я " + имя + "!");
Console.WriteLine(@"
.- __ _ .-.
| ` / |
/ '.()--
| '._/
_| О _ О |_
= '-' /=
'-._____.-'
/`/___/`
//о о/
(_| |_)
|____,____|
(____|____)");
}
//Функция: шоу львов
static void LionAct(имя строки)
{
Console.WriteLine("Привет, я " + имя + "!");
Console.WriteLine(@"
,%%%%%%%%,
,%%/%%%%/%%
,%%%c "" Дж/%%%
%%%%/ о о %%%.
`%%. %%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( / `%%%%%%%'
\ .' |
\ / |
\/ ) |
/_ |__
(____________)))))))))");
}
//определяем делегата
делегировать void AnimalAct (имя строки);
//Функция: цирковое представление (первый параметр — делегат типа AnimalAct)
static void RunCircus(AnimalAct AnimalAct, имя строки)
{
AnimalAct(имя);
}
static void Main(string[] args)
{
//Преобразуем функцию DogAct() в делегат типа AnimalAct
AnimalAct deleDogAct = новый AnimalAct(DogAct);
//Передаем делегат deleDogAct в функцию RunCircus()
RunCircus(deleDogAct, "Снупи");
//Преобразуем функцию CatAct() в делегат типа AnimalAct и передаем его в функцию RunCircus()
RunCircus(new AnimalAct(CatAct), "Китти");
}
Результаты бега следующие:
«Класс для начинающих по C#»
Первый параметр функции RunCircus(AnimalAct AnimalAct, строковое имя) на самом деле представляет собой функцию, представляющую животное. Какая функция ей передается, какое животное будет использоваться. Но чтобы выполнить строгую проверку типов, мы не можем напрямую передать ей имя функции, а должны сначала определить делегата (Dlelegate), то есть определить «тип функции».
Делегат объявляется с ключевым словом делегат. Приведенный выше оператор определяет делегат (тип функции) с именем AnimalAct, который четко определяет тип параметра делегата и тип возвращаемого значения. Когда нам нужно использовать функцию в качестве параметра, мы должны сначала преобразовать ее в экземпляр делегата.
Этот экземпляр делегата затем передается в качестве параметра вызывающей его функции.
Видно, что экземпляр делегата deleDogAct на самом деле является псевдонимом функции DogAct(). Очевидно, что делегат и делегированная функция должны иметь одинаковый тип параметра и тип возвращаемого значения.
В нашей программе цирк всегда вызывает для выполнения функцию RunCircus(). При определении функции RunCircus() мы не знаем и не заботимся о том, какую функцию представляет переданный ей делегат. Эта функция не материализуется до тех пор, пока не будет вызвана функция RunCircus() и ей не будут переданы фактические параметры. Какие бы фактические параметры ему ни были переданы, представление будет выполнено. Если вы передадите ему делегирование deleDogAct, цирк выполнит представление собаки; если вы передадите ему делегирование deleCatAct, цирк выполнит представление кошки, если вы его передадите; Делегация deleLionAct, цирк покажет представление кошек Цирк представил шоу львов. Таким образом, функции, принимающие делегаты в качестве параметров, обладают определенной общностью.