亚洲人成网站在线播放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 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
欧美一区二区影视| 欧美在线视频观看| 久久久精品在线观看| 国产成人综合精品| 久久综合九色综合网站| 久久九九视频| www国产91| 国产精品视频区1| 国产精品久久国产精品99gif | 欧美亚洲一区在线| 欧美v在线观看| 激情小说综合网| 国产综合在线观看视频| 国产免费一区二区三区在线观看| 国产欧美一区二区白浆黑人 | 高清av免费一区中文字幕| 成人精品一二区| 久久久久se| www国产亚洲精品久久网站| 国产精品成熟老女人| 亚洲一二三区在线| 日本精品久久久久影院| 欧美成人高潮一二区在线看| 国产亚洲二区| av一区二区三区在线观看| 国产福利一区视频| 国产精品精品软件视频| 亚洲精品天堂成人片av在线播放| 日本一区不卡| 国产一区二区免费在线观看| 91免费视频国产| 久久久精品日本| 一本大道熟女人妻中文字幕在线 | 欧美日韩高清在线一区| 蜜臀av性久久久久蜜臀av| 99久久99久久精品国产片| 久久久久久久久网站| 久久在线精品视频| 天天综合狠狠精品| 国产综合免费视频| 久久免费看毛片| 欧美精品日韩三级| 日本精品一区| 成人av在线天堂| 久久久精品在线观看| 亚洲人成人77777线观看| 欧美激情精品久久久久久小说| 91久久中文字幕| 国产精品手机播放| 亚洲一区二区三区四区视频| 欧美日韩在线不卡视频| 97久久精品人搡人人玩| 久久精品亚洲一区| 亚洲精品免费在线看| 国产一区二区丝袜| www.xxxx欧美| 色综合电影网| 国产麻花豆剧传媒精品mv在线 | 国产精品一区视频网站| 久久精品在线播放| 午夜精品蜜臀一区二区三区免费| 精品一区在线播放| 国产精品丝袜久久久久久消防器材| 亚洲国产日韩综合一区| 国产欧美一区二区在线播放| 日韩网站免费观看| 色综合666| 69精品丰满人妻无码视频a片| 九九热在线精品视频| 黄色动漫网站入口| 日韩中文有码在线视频| 无码人妻精品一区二区蜜桃网站| 国产精品在线看| 精品毛片久久久久久| 精品欧美日韩在线| 久久久久久一区| 日本电影一区二区三区| 久久精品综合一区| 日韩一区国产在线观看| 99精品国产高清在线观看| 国产99在线播放| 国产老熟妇精品观看| 久久99久国产精品黄毛片入口| 狠狠精品干练久久久无码中文字幕| 日韩在线www| 日本成人在线不卡| 久久久久久久久久久99| 日本aa在线观看| 久久久久久久久久久免费| 午夜精品一区二区三区在线观看 | 国产成人生活片| 欧美在线影院在线视频| 久久久久久九九九| 欧美在线视频一区| 久久天天躁狠狠躁夜夜av| 欧美中文字幕视频| 国产精品爽爽爽爽爽爽在线观看| 男人天堂av片| 欧美成人精品一区| 国产玖玖精品视频| 一本—道久久a久久精品蜜桃| 97国产在线观看| 午夜伦理精品一区| 国产高清精品软男同| 欧美一区视频在线| 国产精品第10页| www黄色在线| 欧美一级视频在线播放| 日韩在线视频免费观看| 男人亚洲天堂网| 欧美日韩福利电影| 91精品国产91久久久久久不卡| 欧美一级片免费播放| www.亚洲一区| 国产欧美在线播放| 日本在线播放不卡| 国产精品爽爽爽| 国产日韩成人内射视频| 一本久道久久综合狠狠爱亚洲精品| 久久精品一区二| 精品一区二区国产| 亚洲午夜精品一区二区三区| 国产不卡精品视男人的天堂| 欧美交换配乱吟粗大25p| 精品国产91亚洲一区二区三区www| 99在线免费观看视频| 日韩欧美99| 久久91亚洲精品中文字幕奶水| 91成人免费观看| 欧美日韩亚洲在线| 亚洲午夜久久久影院伊人| 日韩在线欧美在线| 国产日韩欧美影视| 日韩在线一级片| 国产精品久久二区| 91av在线国产| 国产在线资源一区| 日韩在线综合网| 精品国偷自产一区二区三区| 久久人人爽人人爽人人片av高请 | 男人亚洲天堂网| 亚洲精品久久区二区三区蜜桃臀| 久久久久女教师免费一区| 国产亚洲精品自在久久| 日韩视频在线播放| 中日韩在线视频| 久久精品国产欧美亚洲人人爽| 国产乱码精品一区二区三区卡| 日韩欧美在线一区二区| 亚洲午夜激情| 国产精品久久二区| 日韩在线精品一区| 97国产在线观看| 国产亚洲精品网站| 欧美在线观看视频| 色婷婷精品国产一区二区三区| 国产精品高清免费在线观看| 久久久精品国产一区二区三区| 国产一区一区三区| 欧美亚洲一二三区| 欧美一区2区三区4区公司二百| 欧美日韩成人网| 久久香蕉国产线看观看av| 久精品国产欧美| 99视频免费观看蜜桃视频| 国产自产在线视频一区| 人妻少妇精品久久| 色欲色香天天天综合网www| 夜夜添无码一区二区三区| 欧美大片欧美激情性色a∨久久 | 性日韩欧美在线视频| 中文字幕一区二区三区四区五区人 | 日本国产一区二区三区| 亚洲影院污污.| 欧美精品www| 久久不射热爱视频精品| 国产精品沙发午睡系列| 日韩综合中文字幕| 精品国产依人香蕉在线精品| 国产mv久久久| 91久久久久久久久| 国产乱码一区| 国产伦精品一区二区三区精品视频| 女同一区二区| 韩国视频理论视频久久| 好吊色欧美一区二区三区| 国内精品久久久| 免费观看精品视频| 国产综合在线观看视频| 国产亚洲欧美一区二区三区| 国产尤物av一区二区三区 | 欧美日本亚洲| 男人天堂新网址| 国产这里只有精品| 国产一区二区在线视频播放| 国模视频一区二区三区| 国产自产女人91一区在线观看| 国产欧美一区二区三区视频| 高清视频一区二区三区| 91高跟黑色丝袜呻吟在线观看|