參考原文:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html
一、委託
1、委託是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來傳遞,這種將方法動態地賦值給參數的做法,可以避免在程式中大量使用IF-Else(Switch)語句,同時使得程式具有更好的可擴充性。
例如:
代碼
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate {
//定義委託,它定義了可以代表的方法的類型
public delegate void GreetingDelegate(string name);
class Program {
private static void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}
private static void ChineseGreeting(string name) {
Console.WriteLine("早上好, " + name);
}
//注意此方法,它接受一個GreetingDelegate類型的方法作為參數
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
static void Main(string[] args) {
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("張子陽", ChineseGreeting);
Console.ReadKey();
}
}
}
輸出如下:
Morning, Jimmy Zhang
早上好, 張子陽
2、使用委託可以將多個方法綁定到同一個委託變數,當調用此變數時(這裡用“調用”這個詞,是因為此變數代表一個方法),可以依次調用所有綁定的方法。
例如:
代碼
static void Main(string[] args) {
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // 給此委託變數再綁定一個方法
// 將先後調用 EnglishGreeting 與 ChineseGreeting 方法
GreetPeople("Jimmy Zhang", delegate1);
Console.WriteLine();
delegate1 -= EnglishGreeting; //取消對EnglishGreeting方法的綁定
// 將僅調用 ChineseGreeting
GreetPeople("張子陽", delegate1);
Console.ReadKey();
}
輸出為:
Morning, Jimmy Zhang
早上好, Jimmy Zhang
早上好, 張子陽
二、事件
Event它封裝了委託類型的變數,使得:在類的內部,不管你聲明它是public還是protected,它總是private的。在類的外部,註冊“+=”和登出“-=”的訪問限定符與你在聲明事件時使用的訪問符相同。聲明一個事件不過類似於聲明一個進行了封裝的委託類型的變數而已。
例如:
代碼
public class GreetingManager{
//這一次我們在這裡聲明一個事件
public event GreetingDelegate MakeGreet;
public void GreetPeople(string name) {
MakeGreet(name);
}
}
static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
gm.MakeGreet = EnglishGreeting; // 編譯錯誤1
gm.MakeGreet += ChineseGreeting;
gm.GreetPeople("Jimmy Zhang");
}
MakeGreet事件確實是一個GreetingDelegate類型的委託,只不過不管是不是聲明為public,它總是被聲明為private。另外,它還有兩個方法,分別是add_MakeGreet和remove_MakeGreet,這兩個方法分別用於註冊委託類型的方法和取消註冊。實際上也就是: “+= ”對應 add_MakeGreet,“-=”對應remove_MakeGreet。而這兩個方法的訪問限制取決於聲明事件時的訪問限制符。