學(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蜜桃|
日韩欧美亚洲天堂|