委託的概念作者:梁斌玉摘自《C#初學課堂》即將出版
[email protected]
http://www.cnblogs.com/BeginnerClassroom
有時我們需要將一個函數當作另一個函數的參數,這時就要用到委託(Delegate)機制。委託是較難講清楚的概念,筆者苦思數日,終於想出了一個巧妙的例子。
下面我們設計一個馬戲團表演函數RunCircus(),它的第一個參數是代表動物的函數,傳給它什麼樣的動物,就進行什麼動物的表演。請新建一個名為「Delegate」的項目,然後新增以下程式碼。
試試看:定義委託
//《C#初學課堂》
//函數:狗表演
static void DogAct(string name)
{
Console.WriteLine("Hello,I am " + name + "!");
Console.WriteLine(@"
.----.
_.'__ `.
.--(#)(##)---/#
.' @ /###
: , #####
`-..__.-' _.-###/
`;_: `''
.'''''''`.
/,Snoopy ,
// COOL! \
`-._______.-'
___`. | .'___
(______|______)");
}
//函數:貓表演
static void CatAct(string name)
{
Console.WriteLine("Hello,I am " + name + "!");
Console.WriteLine(@"
.-. __ _ .-.
| ` / |
/ '.()--
| '._/
_| O _ O |_
= '-' /=
'-._____.-'
/`/___/`
//o o/
(_| |_)
|____,____|
(____|____)");
}
//函數:獅子表演
static void LionAct(string name)
{
Console.WriteLine("Hello,I am " + name + "!");
Console.WriteLine(@"
,%%%%%%%%,
,%%/%%%%/%%
,%%%c "" J/%%%
%. %%%%/ o o %%%
`%%. %%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`-/%%%'
(( / `%%%%%%%'
\ .' |
\ / | |
\/ ) | |
/_ | |__
(___________)))))))");
}
//定義委託
delegate void AnimalAct(string name);
//函數:馬戲表演(第一個參數為AnimalAct型委託)
static void RunCircus(AnimalAct animalAct, string name)
{
animalAct(name);
}
static void Main(string[] args)
{
//把函數DogAct()轉換為AnimalAct型委託
AnimalAct deleDogAct = new AnimalAct(DogAct);
//把委託deleDogAct傳給函數RunCircus()
RunCircus(deleDogAct, "Snoopy");
//把函數CatAct()轉換為AnimalAct型委託,並傳給函數RunCircus()
RunCircus(new AnimalAct(CatAct), " Kitty ");
}
運行結果如下:
《C#初學課堂》
函數RunCircus(AnimalAct animalAct, string name)的第一個參數其實是一個代表動物的函數,傳給它什麼樣的函數,它就用什麼樣的動物來表演。但為了進行嚴格的類型檢查,我們不能直接把函數的名稱傳遞給它,而應先定義一個委託(Dlelegate),即定義一種「函數類型」。
委託用關鍵字delegate聲明,上面的語句定義了一種名為AnimalAct的委託(函數類型),明確規定了委託的參數類型和傳回值類型。當我們需要把某個函數當作參數時,就要先把它轉換成委託實例。
然後把這個委託實例以參數的形式傳遞給呼叫它的函數。
由此可以看出委託實例deleDogAct實際上是函數DogAct()的別名,顯然委託和被委託函數應具有相同的參數類型和返回類型。
在我們的程式中,馬戲團總是呼叫函數RunCircus()來表演。定義函數RunCircus()時,我們不知道也不關心傳遞給它的委託代表哪個函數,直到呼叫RunCircus()函數,並且把實際參數傳遞給它時,這個函數才具體化。傳給它什麼樣的實際參數,就進行什麼樣的表演,傳給它deleDogAct委託,馬戲團就進行狗的表演;傳給它deleCatAct委託,馬戲團就進行貓的表演;傳給它deleLionAct委託,馬戲團就進行獅子表演。因此以委託為參數的函數具有一定的通用性。