好男人天堂网,久久精品国产这里是免费,国产精品成人一区二区,男人天堂网2021,男人的天堂在线观看,丁香六月综合激情

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

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

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

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

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

   現(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");
        }
    }

   代碼中事件除了多了個關鍵字聲明之外與普通委托并無不同,那么在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;當編譯器碰到這段代碼時,它會把它轉(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所做的封裝了。

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


安徽新華電腦學校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
高清一级毛片一本到免费观看| 亚洲精品久久玖玖玖玖| 国产一级强片在线观看| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 人人干人人草| 国产一区二区精品| 亚洲第一页乱| 国产一区二区精品尤物| 成人免费观看网欧美片| 韩国三级视频网站| 麻豆系列国产剧在线观看| 韩国三级香港三级日本三级| 国产网站麻豆精品视频| 二级特黄绝大片免费视频大片| 午夜欧美成人香蕉剧场| 黄色免费三级| 青草国产在线观看| 国产成人精品综合在线| 99色视频在线| 九九干| 日韩免费在线视频| 国产成人欧美一区二区三区的| 国产不卡在线播放| 成人免费网站久久久| 欧美激情一区二区三区在线播放| 日韩一级精品视频在线观看| 韩国毛片 免费| 黄视频网站在线免费观看| 九九九国产| 99久久精品国产片| 香蕉视频久久| 日本特黄特色aa大片免费| 国产一区精品| 免费毛片播放| 日韩免费在线观看视频| 91麻豆精品国产自产在线观看一区 | 国产麻豆精品高清在线播放| 美女免费毛片| a级毛片免费观看网站| 国产麻豆精品视频| 亚洲精品永久一区| 欧美激情一区二区三区在线 | 黄色免费三级| 色综合久久久久综合体桃花网| 国产a视频| 天天做日日爱夜夜爽| 香蕉视频久久| 可以免费看毛片的网站| 成人免费观看的视频黄页| 午夜欧美成人香蕉剧场| 久久99欧美| 91麻豆精品国产自产在线观看一区| 超级乱淫黄漫画免费| 国产极品精频在线观看| 欧美大片一区| 国产91精品露脸国语对白| 国产高清视频免费| 国产一区精品| 国产综合91天堂亚洲国产| 欧美一级视频免费观看| 成人a大片在线观看| 香蕉视频一级| 久久99欧美| 青青久久精品| 日韩在线观看网站| 黄视频网站在线观看| 欧美大片一区| 欧美大片aaaa一级毛片| 精品国产三级a∨在线观看| 亚洲女人国产香蕉久久精品| 国产激情一区二区三区| 国产极品精频在线观看| 国产网站在线| 国产成人女人在线视频观看 | 免费国产在线视频| 天堂网中文在线| 精品久久久久久中文字幕一区| 天天色成人| 欧美大片一区| 日韩专区亚洲综合久久| 色综合久久天天综线观看| 黄视频网站在线免费观看| 午夜激情视频在线观看| 国产91丝袜在线播放0| 黄视频网站免费观看| 日日夜人人澡人人澡人人看免| 国产网站在线| 国产一区免费在线观看| 天天色成人| 欧美1区2区3区| 四虎影视久久| 成人a级高清视频在线观看| 成人a级高清视频在线观看| 国产一级生活片| 久久福利影视| 可以免费看毛片的网站| 久久久久久久男人的天堂| 精品视频免费看| 国产网站免费观看| 久久成人综合网| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产不卡在线观看视频| 国产激情一区二区三区| 精品国产一区二区三区精东影业| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产不卡高清在线观看视频| 久久精品免视看国产成人2021| 欧美一区二区三区在线观看| 亚洲天堂在线播放| 日韩一级黄色大片| 四虎影视久久久| 国产亚洲精品成人a在线| 欧美另类videosbestsex久久| 一级片片| 久草免费在线观看| 国产一区二区精品久久| 日韩一级黄色| 国产一区免费在线观看| 精品在线观看一区| 国产亚洲免费观看| 深夜做爰性大片中文| 青青青草视频在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产网站免费视频| 精品久久久久久免费影院| 99热精品一区| 欧美大片aaaa一级毛片| 亚洲精品影院| 国产不卡福利| 国产视频久久久久| 成人高清视频在线观看| 国产视频久久久久| 一级毛片视频免费| 在线观看成人网 | 日韩在线观看免费完整版视频| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日本特黄特黄aaaaa大片| 精品国产亚洲一区二区三区| 久久久成人影院| 欧美电影免费看大全| 亚欧成人乱码一区二区| 99久久精品费精品国产一区二区| 精品久久久久久免费影院| 亚欧视频在线| 亚洲女人国产香蕉久久精品| 免费国产在线视频| 国产高清在线精品一区二区| 国产91丝袜在线播放0| 欧美另类videosbestsex | 青青久久网| 亚洲天堂免费| 国产精品自拍在线观看| 色综合久久天天综合| 欧美激情一区二区三区视频 | 免费的黄色小视频| 日韩在线观看视频免费| 日韩专区一区| 国产精品自拍在线| 九九精品在线| 亚洲天堂在线播放| 国产成人女人在线视频观看| 欧美激情影院| 免费的黄视频| 久久精品欧美一区二区| 九九干| 成人免费观看男女羞羞视频| 国产精品1024永久免费视频| 韩国毛片| 成人免费网站久久久| 天天色色色| 日韩欧美一及在线播放| 999精品视频在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人啪精品| 久久久久久久免费视频| 久久国产影视免费精品| 色综合久久天天综合观看| 久久精品免视看国产明星| 九九久久99| 色综合久久久久综合体桃花网| 国产网站免费视频| 午夜在线亚洲| 久久99中文字幕久久| 亚洲天堂在线播放| 国产一级生活片| 午夜激情视频在线观看| 欧美日本免费| 黄色福利| 久久久成人网| 一级女人毛片人一女人| 九九热国产视频| 麻豆网站在线看| 久久成人综合网| 欧美激情一区二区三区在线| 日韩在线观看免费完整版视频| 国产视频一区二区在线观看| 精品视频在线观看一区二区| 欧美电影免费看大全| 成人高清视频免费观看| 国产精品免费精品自在线观看|