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

當前位置:首頁 > 網站舊欄目 > 學習園地 > 程序開發教程 > 我對.NET中delegate和event區別的理解

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

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

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

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

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

委托事件示例代碼
    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");
        }
    }

   代碼中事件除了多了個關鍵字聲明之外與普通委托并無不同,那么在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關鍵字所做的封裝,也就是它允許myEvent委托僅僅暴露add和remove新的委托,而該委托的其他操作都被禁止了。

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

代碼
// 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所做的封裝了。

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


安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
日韩在线免费高清视频| 国产精品情侣自拍| 久久久国产视频| 亚洲国产一区二区三区在线| 国产在线观看福利| 国产精品三区四区| 色噜噜色狠狠狠狠狠综合色一| 国产美女直播视频一区| 国产精品久久久久久久久免费看| 欧美在线观看一区二区三区| 国产成人av网| 日韩av综合在线观看| 8050国产精品久久久久久| 欧美激情精品久久久| 国产欧美日韩综合精品二区 | 成人毛片网站| 欧美极品欧美精品欧美视频| 精品一区二区三区毛片| 久久精品国产91精品亚洲| 日韩免费一级视频| zzjj国产精品一区二区| 欧美做受高潮1| 俺去亚洲欧洲欧美日韩| 欧美区高清在线| 国产精品美女www| 国产在线视频欧美| 蜜臀久久99精品久久久无需会员 | 91久久久久久久久久久| 亚洲免费视频播放| 91av一区二区三区| 日本精品va在线观看| 国产成人久久777777| 免费看黄在线看| 欧美精品久久久久久久免费观看| 国产精品自拍网| 懂色av一区二区三区四区五区| 久久另类ts人妖一区二区| 日本亚洲欧洲色α| 国产精品欧美一区二区三区奶水| 国产在线精品二区| 亚洲自拍另类欧美丝袜| 国产成人黄色av| 青青草国产精品一区二区| 国产精品美女在线播放| 国产免费人做人爱午夜视频| 亚洲二区自拍| 久久久久久久久久国产| 黄色免费视频大全| 欧美成人在线影院| 久久手机视频| 狠狠97人人婷婷五月| 欧美日韩国产成人在线观看| 91精品国产综合久久男男| 欧洲亚洲一区二区三区四区五区| 国产精品久久久久久av福利| av动漫在线看| 区一区二区三区中文字幕| 国产精品美女999| 91久久夜色精品国产网站| 青青草成人网| 一区二区精品在线| 日韩中文字幕在线视频| 国产日韩精品在线播放| 日本在线高清视频一区| 另类天堂视频在线观看| 久久青青草原一区二区| 国产一区二区丝袜| 日韩.欧美.亚洲| 美女扒开尿口让男人操亚洲视频网站| 久久久女人电视剧免费播放下载| 欧美 日韩 国产在线观看| 亚洲啪啪av| 日韩视频免费观看| 91九色在线免费视频| 免费观看亚洲视频| 日韩av123| 欧美激情在线有限公司| 精品国模在线视频| 91高潮精品免费porn| 国产在线精品成人一区二区三区| 日本精品久久久久影院| 最新欧美日韩亚洲| 国产精品久久精品国产| 久久免费观看视频| 成人美女免费网站视频| 蜜桃视频在线观看91| 日本三级韩国三级久久| 欧美精品在线看| 国产成人久久久精品一区 | 欧美激情图片区| 国产精品视频一区二区三区四| 久久久精品动漫| 成人黄色av网站| 免费观看国产精品视频| 人人妻人人澡人人爽欧美一区 | 国产精品久久久| 日韩在线视频二区| www日韩在线观看| 国产日韩在线免费| 激情内射人妻1区2区3区 | 97精品久久久| 国产精品中文字幕在线观看| 欧美久久在线| 日本欧美视频在线观看| 中文字幕一区二区三区四区五区| 国产精品免费小视频| 国产成人短视频| 国产精品97在线| 91传媒久久久| 国产欧美在线一区二区| 黄www在线观看| 黄在线观看网站| 欧美 日韩 国产 在线观看| 欧美性猛交久久久乱大交小说| 日本天堂免费a| 日日摸天天爽天天爽视频| 亚洲乱码一区二区三区三上悠亚| 综合色婷婷一区二区亚洲欧美国产 | 国产日韩欧美日韩| 国产一区一区三区| 免费看污久久久| 欧美日韩一区二| 欧洲精品久久久| 青青草一区二区| 欧美日韩一道本| 狠狠精品干练久久久无码中文字幕| 欧美福利精品| 韩国视频理论视频久久| 欧美精品久久久久久久免费| 欧美专区福利在线| 精品欧美国产| 国产日韩亚洲欧美在线| 国产欧亚日韩视频| www黄色av| 国产福利精品在线| 色噜噜狠狠狠综合曰曰曰| 色偷偷噜噜噜亚洲男人| 播播国产欧美激情| 国产精品久久久999| 色综合久综合久久综合久鬼88| 亚洲午夜精品国产| 日本成人黄色| 免费久久久久久| www.欧美日本| 久久国产精品一区二区三区| 久久久国产精彩视频美女艺术照福利| 国产精品久久久久久亚洲影视| 精品国产福利| 亚洲一区二区三区av无码| 日日摸天天爽天天爽视频| 欧美在线3区| 蜜桃精品久久久久久久免费影院 | 国产精品主播视频| 91精品国产777在线观看| 久久国产精品高清| 国产精品久久久久久久久久免费| 九九久久综合网站| 日韩中文字幕在线视频观看| 欧日韩一区二区三区| 国产在线观看精品一区二区三区| 9a蜜桃久久久久久免费| 国产成人自拍视频在线观看| 国产精品私拍pans大尺度在线| 精品国产乱码久久久久久久软件| 欧美极品第一页| 手机在线观看国产精品| 欧美日韩精品中文字幕一区二区| 国产伦精品一区二区三区视频免费| 久久伊人一区二区| 国产精品久久久对白| 无码人妻h动漫| 国产综合久久久久| 国产精品aaa| 欧美xxxx综合视频| 日韩av综合在线观看| 国产日韩欧美综合精品| 国产盗摄视频在线观看| 欧美xxxx综合视频| 日韩精品资源| 国产欧美日韩伦理| 日韩视频一区在线| 亚洲二区自拍| 国产欧美日韩专区发布| 久久国产精品精品国产色婷婷| 久久亚洲春色中文字幕| 三级网在线观看| 国产精品一区av| 国产精品免费在线| 日本一区二区三区精品视频| 国产美女久久久| 久久精品成人一区二区三区| 亚洲淫片在线视频| 美女主播视频一区| 久久久久久国产免费| 久久99精品久久久久久青青91| 欧美与黑人午夜性猛交久久久| 91av在线播放| 中文字幕一区二区三区四区五区 | 精品免费日产一区一区三区免费 | 国产精品久久久久久久久久东京 |