對於初學者來講,委派 (Delegate) 是一個聽起來非常令人迷惑的名詞,不過當我們在撰寫 .Net 程式的時候其實都不知不覺地在使用委派。
對於初學者來講,委派 (Delegate) 是一個聽起來非常令人迷惑的名詞,不過當我們在撰寫 .Net 程式的時候其實都不知不覺地在使用委派。一個最常見的例子就是事件,例如以下的程式碼:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
End Sub
private void button1_Click(object sender, EventArgs e)
{
}
以上的程式碼就是當你在設計畫面上放了一個 Button 控制項,然後再對著該 Button 雙擊 (Double Click) 後出現的程式碼;事實上這個 Button1_Click (或 button1_Click) 方法就是『委派』給 Button1的Click事件,關於委派和事件的關係容後文再敘,這邊只是簡單的說明『其實你常常在用委派,所以它真的沒有這麼可怕』。
言歸正傳,那委派究竟是什麼?這兩個字實在很難讓人望文生義,還真瞧不出什麼端倪。委派有個近親在 C++ 中稱之為『函式指標』,聽起來有比較容易懂一點,但對初學者來說,『指標』這詞恐怕又是另外一個障礙。所以我決定用一個類比的方法來說明一下委派的概念,所以我們來聊聊倚天屠龍記的主角張無忌,如果我們把單一委派比喻為人的名號,於是:
(1) 在趙敏的心中:無忌哥哥 = 張無忌
(2) 在金毛獅王的心中: 無忌孩兒 = 張無忌
(3) 在蛛兒的心中:狠心短命的小鬼 = 張無忌
(4) 在滅絕師太心中:小淫賊 = 張無忌
我們把張無忌想像成一個Method ,所以呢,在在趙敏的心中就是把『無忌哥哥』這名號委派給張無忌;在在滅絕師太心中則是把『小淫賊』這名號委派給張無忌,以此類推。所以當滅絕師太講到小淫賊三個字就是指向張無忌 ,你可以翻翻倚天屠龍記就可以知道我講的沒錯。這概念很簡單,也應該很容易明瞭吧?那我們怎麼用程式碼表示這樣的委派?
Public Class Form1
Public Delegate Sub 人()
Public 小淫賊 As 人
Private Sub 張無忌()
''聽到有人叫他就答右
MessageBox.Show("右")
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
小淫賊 = AddressOf 張無忌
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
''假設Button1.Click 事件是滅絕師太叫張無忌
小淫賊()
End Sub
End Class
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public delegate void 人();
人 小淫賊;
private void 張無忌()
{
//聽到有人叫他就答右
MessageBox.Show("右");
}
private void Form1_Load(object sender, EventArgs e)
{
小淫賊 = 張無忌;
}
private void button1_Click(object sender, EventArgs e)
{
//假設Button1.Click 事件是滅絕師太叫張無忌
小淫賊();
}
}
程式的一開始我們宣告一個稱為『人』的委派型別,因為假設名號都是要委派給人,然後我們有一個以人為型別的委派變數叫『小淫賊』;接著我們建立一個名為『張無忌』的方法,這方法就是當有人叫他時就答右。Form_Load 就是滅絕師太心中把『小淫賊』委派給『張無忌』,於是當滅絕師在在喊小淫賊的時候,張無忌就會自動答右。
雖然我這例子有點給它亂七八糟,但應該不難懂,如果你是不懂啥叫委派的人,從今天你只要記得『小淫賊就是張無忌,委派可以想像成方法(函式)的外號』,然後再慢慢地去練習去體會它真正的原理。
【附註】使用中文寫程式純粹是娛樂效果,不鼓勵開發時使用。