學(xué)習(xí)委托(2)-------解析委托的實現(xiàn)機(jī)制
2006/12/30 22:45:31
在前一篇文章中,從函數(shù)指針的角度談?wù)摿宋?,本篇文章來?NET是如何為我們實現(xiàn)委托的。為了討論方便,把上一次C#委托的代碼寫在下面:
class liyufeng
    {
        public static void mySay()
        {
            System.Console.WriteLine("I Like You,Do you know,if you don’t know,now I must tell you ,tell you!");
        }
    }
class goodfriend
    {
        public delegate void middleSay();
        public static void friendSay(middleSay say)
        {
            say();
        }
    }
class beautifulpark
    {
        static void Main(string[] args)
        {
            goodfriend.friendSay(liyufeng.mySay);
            System.Console.Read();
        }
    }
  首先看委托的聲明public delegate void middleSay(),前面提到過,委托是函數(shù)指針封裝成了對象,也就是說委托也應(yīng)該是一個類,那么這里是通過Delegate關(guān)鍵字,而不是用聲明類的關(guān)鍵字Class,也很顯然,從上面這句代碼無論如何也看不出來委托是一個類,表面上看它似乎是一個方法。要弄清楚這一點,我們需要用到ILdasm這個查看MSIL代碼的工具,通過它便可一目了然,其實.NET編譯器背后為我們做了很多的工作。下面是聲明委托middleSay的IL代碼:
.class auto ansi sealed nested public middleSay
      extends [mscorlib]System.MulticastDelegate
{
    .method public hidebysig specialname rtspecialname 
        instance void .ctor(object 'object',
                            native int 'method') runtime managed
    {
    }
    .method public hidebysig newslot virtual 
        instance class [mscorlib]System.IAsyncResult 
        BeginInvoke(class [mscorlib]System.AsyncCallback callback,
                    object 'object') runtime managed
    {
    }
    .method public hidebysig newslot virtual 
        instance void EndInvoke(class [mscorlib]System.IAsyncResult result) runtime managed
    {
    }
    .method public hidebysig newslot virtual 
        instance void Invoke() runtime managed
    {
    }
}
關(guān)于上面IL代碼的語法我們不必太理會,也可以明白的看出我們聲明的委托middleSay的確是一個從MulticastDelegate繼承而來的類,并且有一個構(gòu)造函數(shù)和三個成員函數(shù)。只是.NET編譯器不允許我們自己直接從MulticastDelegate顯式繼承,否則上面的代碼我們完全可以自己實現(xiàn)。看一下MulticastDelegate類的聲明:
public abstract class MulticastDelegate : Delegate
{
}
可以看出它是一個抽象類,并且從Delegate繼承;前面文章曾提到過,我們可以利用委托一次調(diào)用多個函數(shù),所以這里的MulticastDelegate,從字面也可大概猜出它的功能,它主要是為我們準(zhǔn)備了一個委托對象的鏈表,從而為我們調(diào)用多個委托函數(shù)提供了支持,也就是大家常說的多播委托,而它的父類Delegate,為調(diào)用一個委托函數(shù)提供必要的支持,微軟本意是這么設(shè)計的,但是其實我們聲明的委托全部是從MulticastDelegate繼承而來的,也就說單播委托和多播委托的實現(xiàn)機(jī)制是相同的,無論單播還是多播都會被MulticastDelegate保存到自身的鏈表中,在進(jìn)行委托函數(shù)調(diào)用時,都是一個個的按次序輪流調(diào)用,直到把委托鏈表中的委托對象全部都調(diào)用一遍。關(guān)于MulticastDelegate和Delegate,應(yīng)該說是微軟設(shè)計上的一個失誤,Jeffrey Richter先生在書中提到微軟應(yīng)該在.NET未來的版本中將這兩個類合并到一起,但到目前的2.0版本,它們?nèi)匀贿€未合并。

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 中文字幕国产剧情| 亚洲欧美国产中文| 久久久久亚洲精品无码网址色欲| 欧美色综合高清视频在线| 午夜福利视频合集1000| 麻豆国产精品va在线观看不卡| 国产精品欧美亚洲韩国日本| chinese猛攻打桩机体育生| 成人污视频在线观看| 久久人人爽人人爽人人片dvd| 欧美一区二区三区婷婷月色| 亚洲第一区视频| 男女做www免费高清视频| 啊灬啊灬啊灬快好深用力免费| 视频一区二区精品的福利| 国产成人精品综合在线观看| 爽爽影院在线看| 国产香蕉精品视频| A国产一区二区免费入口| 小宝极品内射国产在线| 中文字幕亚洲欧美日韩不卡| 日本天堂在线视频| 久久精品女人天堂AV麻| 欧美成人片一区二区三区| 亚洲熟妇无码久久精品| 狼人久蕉在线播放| 免费中文字幕一级毛片| 精品久久久久久无码中文字幕| 哪个网站可以看毛片| 色综合久久综合网| 国产伦精品一区二区三区无广告| 好吊色青青青国产在线播放| 国产精品一区二区久久| 114级毛片免费观看| 国产美女19p爽一下| 97av视频在线播放| 国内精品伊人久久久久777 | 中文字幕巨大乳在线看| 日本中文在线视频| 久久人妻少妇嫩草av蜜桃| 日韩欧美亚洲天堂|