委托(delegate),剛開始學的時候覺得很難理解,我們可以把它看作是一個修飾符,用來修飾一個類的類型,就像public, static等一樣。定義一個delegate類和我們平時定義類差不多。我們來看一下我們經常用到的EventHandler類的定義,它是.NET中的一個類:
Code
public delegate void EventHandler(object sender, EventArgs e);
上面的代碼可以看成是定義一個delegate的類,類的名字是EventHandler。下面是我定義一個普通的類,看看它們之間有什麼區別:
Code
public class UserInfo{}
可以看到,delegate的類和普通的類的定義還是有比較大的不同的,這只要記住它的格式就行了。我們再看看創建類的實例:
Code
UserInfo userInfo = new UserInfo();
EventHandler handler = new EventHandler(MethodName);
從代碼中可以,它和創建普通的類的實例沒什麼不同,只是它必須要有參數,而且只能有一個。這個參數很特別,它不是什麼類型的參數,而是方法的名字。方法有很多的類型(這裡不是指public,static等等這種類型),就像參數也有很多種類型一樣,它總不能是無論什麼樣的方法都接受吧。那是當然的了,它到底能接受什麼樣的方法呢。這就需要用到修飾了。
上前面,我們看到了定義delegate的類有很大的不同。在它的後面多了一個void,它的前面也多了兩個參數,這些是干什麼用的呢?可能你已經想到了,就是用來修飾方法的類型的。它限定了方法的返回值必須是void,它的參數是(object sender, EventArgs e),只要符合這兩個要求的方法都可以傳給它。
上面的代碼還可以簡單地寫成:EventHandler handler= MethodName;。這樣賦值的話,它的實例像不像是一個方法指針了呢?賦值後我們就能像調用方法一樣調用它了,如:handler(sender, e); ,調用handler,就相當於是調用了方法MethodName。通過handler調用MethodName的過程就叫做代理,也可以叫做委托,也就是MethodName把使用權委托給handler。