首先我們以書中所介紹的委托的由來為起始點展開話題:
在C或C++中有時為了開啟一個子線程,我們會用到如下的方法:
HANDLE hThread;
DWord ThreadID;
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID);
以上語句中的ThreadFunc()為C++中的一個全局方法。因為C++或者C語言都是允許面向過程的,因此全局函數是可以存在的。但大家不妨試想一下,如果是C#或者Java這種純面向對象的語言,我們要怎麼做呢?
思考一下,在C#中你可以用如下的代碼來實現相同的效果嗎?
Tread subTread = new Tread();
subTread.Start(EntryPoint);
這樣做是明顯不對的!在C++中函數名EntryPoint實際上就是一個全局函數指針,它表明了子線程的入口地址。然而,在C#中這樣的情況是絕對不存在的!原因很簡單——作為一門面向對象的語言,C#中很少有方法是獨立於對象而存在的。
在C#中調用方法時,這些方法通常都要與一個類的實例相關聯。也就是說,如果要傳遞一個方法,那麼就必須把該方法的相關細節包裝在一種新型的對象中。於是,伴隨著這種需要,委托隨之誕生。
以上只是《C#高級編程》一書中所提到的委托的產生過程,在這裡我並不想深究其中的機制,而是以此為線索,深層次的挖掘C#中委托的實質用途及其優勢所在。
這樣一來,首先單純根據委托的定義可知,委托可以簡單的包裝方法的細節:
1.簡單的包裝方法
namespace SimpleDelegate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定義委托
private delegate void MyDelegete();
//聲明委托的實例變量,並為其掛載相應的方法
private MyDelegete MyObjdelegate = new MyDelegete(MyFun);
private void button1_Click(object sender, EventArgs e)
{
MyObjdelegate();
}
static private void MyFun()
{
MessageBox.Show("委托掛載的事件調用成功!");
}
}
}