其實,恐怕大家在看完(一)之後便已經在心中產生了一個呼之欲出的想法——委托就是函數指針!最初,我也曾有過這樣的想法,只是並未在相應的文獻資料中找到支撐。然而這是後話,是當我自己對於委托的理解到達可以寫得出第一篇隨筆之後才可能有的見解。因此,先前的幾篇雖名為《我眼中委托的真正面貌》,實則是我自己對於委托的一個探索過程,因此,我以委托常見且較有代表性的幾個用法來組織文章的脈絡。個人感覺,對於一個未知的對象,這樣一個由淺入深的過程其實是很有必要的。至少,我希望可以幫那些和我一樣對於委托並不是太了解的朋友們少走一些彎路。
不過,想法歸想法,我說過暫時沒有找到相應的理論支撐。因此,我仍然以探索的態度來闡述自己的一些觀點,歡迎大家批評指正,同時希望已經完全摸透委托機制的高人們不吝賜教。
前不久一個偶然的機會搜到了這樣一篇文章:
從函數指針到代理(C#代理入門)
作者是木頭象朋友。他在文中為我們闡述了這樣的觀點:委托是函數指針功能的擴展。
其實,個人感覺這句話闡明的觀點還是有一定的道理的,感興趣的朋友們可以支持一下木頭象朋友的帖子。這個觀點究竟正確與否,我們姑且不論。然而,我們卻可以以此為論題,來探討一下委托比之函數指針究竟有哪些功能上的擴展。
C#中要了解一個對象自身的一些特質其實很簡單,我們甚至無需依賴於MSDN,你只需聲明相應的對象,在此之後點一個“.”,C#編譯器的智能感知功能便會自動列出這個對象的相關屬性及其方法的一些簡單描述。
我們用一個實例化的委托對象進行如上操作,便可大致了解委托對象的一些特有的方法和屬性了。這裡我們討論幾個關鍵方法的使用方法:
9.異步委托的實現
using System.Threading;
namespace AsyncDelegate
{
class Program
{
//定義委托
delegate void MyDelegate();
static void Main(string[] args)
{
//聲明委托對象
MyDelegate ObjDelegate = new MyDelegate(ObjDelegateFun);
//使用異步方式
IAsyncResult ObjIr = ObjDelegate.BeginInvoke(null,null);
Console.WriteLine("委托方法執行中.");
Thread.Sleep(5000);
ObjDelegate.EndInvoke(ObjIr);
Console.ReadLine();
}
static private void ObjDelegateFun()
{
Thread.Sleep(5000);
Console.WriteLine("委托方法調用成功!");
}
}
}