麻豆传媒视频在线,国产91精品不卡视频,欧美jizz19性欧美,污视频网站在线观看,91涩漫在线观看,伊人发布在线,九色porny丨首页在线,福利视频一区,久久av网址,久久人人视频

當前位置:首頁 > 網站舊欄目 > 學習園地 > 程序開發教程 > 我對.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所做的封裝了。

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


安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
成人黄色av网址| a成人v在线| 欧美黑人又粗大| 欧美一二三在线| 亚洲免费在线视频一区 二区| 久久99国产精品久久99果冻传媒| 中文在线播放一区二区| 成人看片爽爽爽| 一区二区视频免费完整版观看| 蝌蚪视频在线播放| 色视频在线看| 国产精品美女久久| 久久久免费观看视频| 欧美精品情趣视频| 在线视频欧美性高潮| 中文字幕av一区中文字幕天堂 | 激情久久一区二区| 成年人黄色大片在线| 国产在线天堂www网在线观看| 欧美午夜电影一区二区三区| caoporn国产精品免费视频| 精品视频二区| 欧美精品电影| h网站久久久| 美女精品视频| 日韩精品一级| 国产欧美亚洲精品a| 日韩精品不卡一区二区| 在线国产精品一区| 激情av综合网| 久久久久久亚洲综合| 国产色产综合产在线视频| 1024精品合集| 欧美日韩亚洲一区二区| 精品日本一线二线三线不卡| 亚洲美女久久久| 97av在线视频| 天天夜夜亚洲| 草莓视频丝瓜在线观看丝瓜18| 欧美成a人片免费观看久久五月天| 国语一区二区三区| 蜜桃久久av| 国产精品色噜噜| 日韩三级视频在线观看| 久久久久久国产精品三级玉女聊斋| 天天看片激情网站| 蜜桃视频在线观看免费视频| 亚洲动漫精品| 久久精品国产成人一区二区三区 | 欧美老妇交乱视频| 四色成人av永久网址| 91超碰在线免费| 午夜激情久久| 国产欧美一区视频| 日韩精品一区二区三区蜜臀| 91国内揄拍国内精品对白| 国产中文字幕在线视频| 国产福利资源一区| 成人黄页在线观看| 亚洲精品美女久久| 在线观看视频污| 国产亚洲观看| 激情五月激情综合网| 色av一区二区| 国产成人久久久精品一区| 亚洲优女在线| 日本vs亚洲vs韩国一区三区| 欧美在线不卡一区| 国产精品一久久香蕉国产线看观看| 91视频欧美| 亚洲免费成人| 欧美性猛交xxxx| 成人av.网址在线网站| 123成人网| 国产真实乱偷精品视频免| 欧美综合视频在线观看| 美女的尿口免费视频| 精品久久久久久久久久岛国gif| 极品美女销魂一区二区三区免费 | 国产国产国产国产国产国产| 911亚洲精品| 国产精品美女久久久久久| 97久久伊人激情网| 国产精品久久久久久久久久齐齐| 国产v综合v亚洲欧| 色综合伊人色综合网| 超碰在线网站| av中文字幕不卡| 午夜精品福利在线观看| 国产一区二区三区朝在线观看| 91视频你懂的| 国产精品久久999| 清纯唯美亚洲经典中文字幕| 亚洲色图在线播放| 国产欧美在线播放| 欧美日韩精品在线一区| 欧洲精品一区二区| 成人高潮成人免费观看| 蜜桃视频一区二区三区| 亚洲最新av在线| 一级欧美视频| 亚洲高清中文字幕| 欧美亚洲日本| 国产精品中文字幕日韩精品| 欧美一级淫片videoshd| 99re6这里只有精品| 精品香蕉一区二区三区| 国产精东传媒成人av电影| 在线观看免费视频综合| 欧洲黄色一区| 精品久久久久久中文字幕一区奶水| www.久久热.com| 91在线观看污| 国产精品二线| jlzzjlzz亚洲日本少妇| 成人c视频免费高清在线观看| 久久99精品一区二区三区| 8090成年在线看片午夜| 欧美一级视频| 8090成年在线看片午夜| 在线观看的日韩av| 91av在线免费观看| 国产亚洲毛片在线| 国产精品视频一区国模私拍| 麻豆精品一区二区综合av| 国产精品狠色婷| 成人午夜视频网站| 激情视频在线观看免费| 一区二区中文字幕在线| 日p在线观看| 日韩欧美成人精品| 国产精品网在线观看| 中文字幕日韩视频| 91久久国产| 国产成人在线一区| 97久久精品人人做人人爽| 免费在线看黄网站| 欧美精品v国产精品v日韩精品| 亚洲3区在线| 欧美黑人又粗大| 精品综合久久久久久8888| 老司机在线看片网av| 亚洲成人福利片| 少妇精品视频在线观看| 亚洲区一区二区| 久久资源在线| 国产三级视频在线| 欧美午夜影院一区| 四虎成人精品永久免费av九九| 欧美影院久久久| 国产精品国产三级国产aⅴ中文| 久久www人成免费看片中文| 日韩午夜av一区| 亚洲国产高清一区| 在线中文字幕视频| 欧美在线一区二区三区| 日韩毛片视频| 国产福利a级| 欧美日韩国产中文字幕| 亚瑟一区二区三区四区| 国产精品久久久久久久久久ktv| 国产精品女主播av| 91嫩草精品| 95影院理论片在线观看| 欧美亚洲自拍偷拍| 好看不卡的中文字幕| 福利片在线观看| 亚洲国产欧美一区| 国产美女一区二区三区| 绿色成人影院| 国精产品一区一区三区有限在线| 国产精品国产三级国产三级人妇| 狼人天天伊人久久| 久久综合色播| 精品国产乱码久久久久久1区2区 | 亚洲无中文字幕| 电影av一区| 欧美激情视频给我| 亚洲婷婷在线视频| 国产综合自拍| av剧情在线观看| 国产精品入口尤物| 91精品黄色片免费大全| 成人av网址在线观看| 亚洲免费福利一区| 2019中文字幕在线视频| 欧美激情网友自拍| 91久久精品一区二区三| 国产一区二区免费视频| 欧美理论电影在线精品| 国产精品刘玥久久一区| 欧美激情欧美激情| 欧美精品日韩精品| 国产精品久久三| 轻轻草成人在线| 91蝌蚪精品视频| 888av在线视频| 国产精品国产自产拍高清av王其| 国产原创欧美精品| 久青草国产97香蕉在线视频|