亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区

當(dāng)前位置:首頁 > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 程序開發(fā)教程 > 我對.NET中delegate和event區(qū)別的理解

我對.NET中delegate和event區(qū)別的理解
2009-12-23 10:53:14  作者:cnblogs  來源:cnblogs

       前幾天和朋友老鄧討論delegateevent區(qū)別的時候,老鄧問我對他們的理解,當(dāng)時自己沒理解清楚,只是很簡單的一句話:event就是特殊的delegate,也即eventdelegate的子集。并且我對老鄧解釋只要你愿意并完全信任調(diào)用自己代碼的client,你完全可以將所有的事件用delegate代替。

       后面自己仔細(xì)思考了一下,發(fā)現(xiàn)自己理解的局限性,確實delegateevent有很多的相似之處,并且delegate完全能實現(xiàn)event的功能。但我并未認(rèn)證考慮為什么微軟要設(shè)計這樣一個限制了delegate功能的東西出來,也沒從觀察者角度理解events。相對delegate來說,客戶端即觀察者只能調(diào)用+=或者-+來添加自己對相應(yīng)事件觸發(fā)的通知,它不能調(diào)用new來實例化發(fā)布者的event事件如單擊事件,或者直接將發(fā)布者的event對象直接賦值null從而撤銷發(fā)布者所有通知列表,也不能通過調(diào)用諸如this.btn.clck(obj,e)之類的方式來觸發(fā)event發(fā)布事件通知。當(dāng)我們理解了觀察者模式并完全站在實際對象角度考慮相信就不難理解為什么event會比delegate多這么多限制了,很顯然,第一,觀察者不能也不應(yīng)該有權(quán)限實例化事件發(fā)布者的消息列表,同理,觀察者不應(yīng)該能控制事件發(fā)布者對事件的通知,這些所有的操作應(yīng)該都是發(fā)布者內(nèi)部的事件而不能交由外部對象來控制,因此,才產(chǎn)生了event對象,它是通過對delegate的限制來封裝一部分本來就不應(yīng)該暴露在外的行為,從而更符合面向?qū)ο蟮乃季S。我想,在發(fā)布者內(nèi)部的click應(yīng)該還是一個委托,不過在添加了event關(guān)鍵字之后,.net會通過一系列方法將這個delegate包裹起來從而封裝了一部分本來就不應(yīng)該暴露的行為。這樣更符合面向?qū)ο蟮淖龇ā?/span>

      因此我認(rèn)為event在本質(zhì)上所做的工作應(yīng)該還是通過delegate來實現(xiàn)的,或者至少原理相同,event關(guān)鍵字只不過是clr給我們對所定義的delegate對象的一個封裝,這樣對象可以不必暴露本來就不應(yīng)該被外部對象看到的方法,如果愿意的話,我們完全可以自己去做這些封裝的工作。他們最終都是使得我們所定義的對象更加符合封裝的原則。

   現(xiàn)在我們可以用代碼驗證這個猜想是否正確,首先看一段代碼:

委托事件示例代碼
    public delegate void TestDelegate();
    
class Program
    {
        
public static TestDelegate myDelegate;//普通的委托聲明
        public static event TestDelegate myEvent;//事件聲明
        static void Main(string[] args)
        {
            myDelegate 
+= TestEvent;
            myEvent 
+= TestEvent;
            myDelegate();
            myEvent();
        }
        
static void TestEvent()
        {
            Console.WriteLine(
"Hello Event");
        }
    }

   代碼中事件除了多了個關(guān)鍵字聲明之外與普通委托并無不同,那么在Reflector中它們有何不同呢?

委托事件IL代碼
.class private auto ansi beforefieldinit Program
    extends [mscorlib]System.Object
{
    .
event ConsoleApplication1.TestDelegate myEvent
    {
        .addon 
void ConsoleApplication1.Program::add_myEvent(class ConsoleApplication1.TestDelegate)
        .removeon 
void ConsoleApplication1.Program::remove_myEvent(class ConsoleApplication1.TestDelegate)
    }
    .method 
public hidebysig specialname rtspecialname instance void .ctor() cil managed
    {
    }
    .method 
private hidebysig static void Main(string[] args) cil managed
    {
        .entrypoint
    }
    .method 
private hidebysig static void TestEvent() cil managed
    {
    }
    .field 
public static class ConsoleApplication1.TestDelegate myDelegate

    .field 
private static class ConsoleApplication1.TestDelegate myEvent
}

   這里我們可以看到在IL中它會首先聲明一個同名普通私有字段,注意這里該字段被聲明成私有的,這是為了防止外部對象非法訪問這個委托,然后再看上面的event會有兩個操作:

代碼
.event ConsoleApplication1.TestDelegate myEvent
    {
        .addon 
void ConsoleApplication1.Program::add_myEvent(class ConsoleApplication1.TestDelegate)
        .removeon 
void ConsoleApplication1.Program::remove_myEvent(class ConsoleApplication1.TestDelegate)
    }

  這個就是event關(guān)鍵字所做的封裝,也就是它允許myEvent委托僅僅暴露add和remove新的委托,而該委托的其他操作都被禁止了。

  上面是我自己做的一些研究,后面我讀到CLR via C#時候看到對事件類似的描述,在書中第230頁(英文版)中提到, 在我們聲明一個事件的時候,其實編譯器會幫你生成一些代碼,e.g. public event EventHandler<NewMailEventArgs> NewMail;當(dāng)編譯器碰到這段代碼時,它會把它轉(zhuǎn)換成下面的代碼:

代碼
// 1. A PRIVATE delegate field that is initialized to null 
private EventHandler<NewMailEventArgs> NewMail = null
// 2. A PUBLIC add_Xxx method (where xxx is the Event name) 
// Allows objects to register interest in the event. 
[MethodImpl(MethodImplOptions.Synchronized)]
public void add_NewMail(EventHandler<NewMailEventArgs> value) { 
NewMail 
= (EventHandler<NewMailEventArgs>
Delegate.Combine(NewMail, value); 
}
// 3. A PUBLIC remove_Xxx method (where Xxx is the Event name) 
// Allows objects to unregister interest in the event. 
[MethodImpl(MethodImplOptions.Synchronized)]
public void remove_NewMail(EventHandler<NewMailEventArgs> value) { 
NewMail 
= (EventHandler<NewMailEventArgs>
Delegate.Remove(NewMail, value); 
}

   這段代碼跟我在Reflector中看到的IL類似。這里正是event對delegate所做的封裝了。

   最后謝謝文楚,由于很少分享自己所得,很多東西我并未深入研究,僅僅停留在猜想階段就不了了。希望后面補(bǔ)充的東西能對別人有所幫助吧!


安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
欧美理论片在线观看| 亚洲一区二区精品在线| 国内自拍欧美激情| 欧美在线一二三区| 欧美一区激情视频在线观看| 欧美牲交a欧美牲交aⅴ免费下载| 欧美少妇一区二区三区| 欧美精品一区二区三区四区五区 | 亚洲www在线| 亚洲三级一区| 少妇一晚三次一区二区三区| 色欲色香天天天综合网www| 日日碰狠狠躁久久躁婷婷| 日本中文字幕不卡免费| 日韩欧美视频一区二区 | 国产青青在线视频| 国产乱人伦真实精品视频| 成人美女免费网站视频| 久久亚洲精品欧美| 久久精品影视伊人网| 欧美激情视频网| 久久久久久国产精品美女| 亚洲在线免费视频| 日本电影亚洲天堂| 蜜桃传媒一区二区三区 | 国产九九九九九| 久久久一二三四| 久久精品国产清自在天天线| 精品国产免费人成电影在线观...| 一级一片免费播放| 日韩视频在线观看视频| 国产在线播放91| 久久久亚洲精品无码| 久久精品国产精品国产精品污| 国产成人精品一区二区三区| 精品国产一区二区三区麻豆小说| 日本在线观看天堂男亚洲| 国产一区二区在线免费| 久久人人爽人人爽人人av| 精品国偷自产在线视频| 中文字幕在线亚洲精品| 青青a在线精品免费观看| 国产男女在线观看| 久久久久久国产精品免费免费| 中文字幕成人一区| 欧美精品一区二区性色a+v| 国产精品香蕉在线观看| 精品国产拍在线观看| 亚洲欧洲日产国码无码久久99| 极品日韩久久| 久久免费看av| 久久久久国产精品www| 欧美精品v日韩精品v国产精品| 91精品久久久久久久久久久 | 国产精品ⅴa在线观看h| 国产精品久久久久免费a∨大胸| 亚洲www永久成人夜色| 国产亚洲二区| 国产精品丝袜久久久久久消防器材| 亚洲精品在线免费| 国产区日韩欧美| 国产成人精品一区二区三区福利| 亚洲国产欧美日韩| 国产综合在线观看视频| 国产日韩精品电影| 精品国产一区二区三区久久久| 亚洲永久一区二区三区在线| 国产在线久久久| 日韩中文字幕视频在线观看| 中文字幕日本最新乱码视频| 亚洲a中文字幕| 国产一区二区丝袜高跟鞋图片| 国产成人无码av在线播放dvd | 久久久国产精品一区二区三区| 精品久久精品久久| 国语精品中文字幕| 色妞久久福利网| 日韩视频在线视频| 久久国产精品一区二区三区四区 | 91久久精品久久国产性色也91| 久久伊人色综合| 黄色一级片播放| 国产精品天天狠天天看| 欧美韩国日本在线| 久久久久网址| 日韩免费在线观看视频| 国产l精品国产亚洲区久久| 欧美一级视频在线观看| 久久久av水蜜桃| 日韩最新中文字幕| 国产精品第12页| 欧美激情综合亚洲一二区| 激情五月婷婷六月| 俺也去精品视频在线观看| 日本一区二区三不卡| 久久免费视频网| 国产成人精品自拍| 人人做人人澡人人爽欧美| 久久99精品国产99久久 | 日韩亚洲欧美成人| 人人爽久久涩噜噜噜网站| 久久久久久久久综合| 青青草国产精品| 国产成人久久久| 蜜桃视频一区二区在线观看| 精品久久免费观看| 国产精品亚洲一区| 亚洲欧美日韩精品在线| 久久理论片午夜琪琪电影网| 日本在线视频不卡| 久久精品2019中文字幕| 国产系列第一页| 在线观看免费黄色片| 成人h在线播放| 午夜dv内射一区二区| 久久久久久噜噜噜久久久精品| 人妻av无码专区| 国产精品第100页| av动漫在线观看| 日本成人黄色免费看| 国产精品久久久久久久久久东京 | 国产精品入口芒果| 成人中文字幕av| 欧美中文字幕在线观看视频| 国产精品久久97| 91久久精品www人人做人人爽| 日本在线视频www| 国产精品久久久久久影视| 国产精品一区二区欧美黑人喷潮水| 亚洲va欧美va在线观看| 国产成人拍精品视频午夜网站| 国产女女做受ⅹxx高潮| 日韩中文字幕二区| 国产精品国语对白| 97成人精品视频在线观看| 日本精品久久久| 欧美激情xxxxx| 久久精品电影一区二区| av日韩中文字幕| 狠狠精品干练久久久无码中文字幕| 色综合五月天导航| 日韩在线精品一区| 国产精品又粗又长| 人妻夜夜添夜夜无码av| 在线视频一区观看| 久久天天躁狠狠躁夜夜躁| 99久久久精品视频| 欧美精品一区二区三区三州| 亚洲精品国产精品国自产| 久久久999国产| 久久青草福利网站| 国产欧美一区二区三区久久人妖| 欧美午夜视频在线| 丁香六月激情婷婷| 欧美日韩国产va另类| 国产精品入口免费视| 久久理论片午夜琪琪电影网| 国产女人18毛片水18精品| 欧美日韩视频免费| 日韩在线第一区| 亚洲最大成人在线| 欧美精品一区二区免费| 国产精品入口芒果| 日韩在线小视频| 91精品国产综合久久男男| 国产欧美一区二区三区另类精品 | 欧美一级成年大片在线观看| 亚洲a区在线视频| 欧美激情中文字幕在线| 国产精品精品视频一区二区三区 | 少妇免费毛片久久久久久久久| 久久91精品国产91久久久| 日韩视频免费大全中文字幕| 久久久免费视频网站| 91久热免费在线视频| 国产精品午夜一区二区欲梦 | 免费观看国产成人| 欧美精品无码一区二区三区| 日本阿v视频在线观看| 天堂精品一区二区三区| 亚洲欧美日韩不卡一区二区三区 | 国产精品久久久久久久免费大片| 久久免费少妇高潮久久精品99| 91久久伊人青青碰碰婷婷| 成人中文字幕av| 成人av中文| av免费观看久久| wwwwww欧美| 91精品在线看| 99视频精品免费| 99久久无色码| 久久免费视频3| 国产成人欧美在线观看| 久久久黄色av| 国产精品久久久亚洲| 精品视频9999| 亚洲午夜激情| 午夜午夜精品一区二区三区文| 午夜精品一区二区在线观看| 色一情一乱一乱一区91|