国产精品一区二区精品_久久小视频_天堂va在线观看_99久久夜色精品国产亚洲96_日本手机在线视频_av成人免费

當(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代替。

       后面自己仔細思考了一下,發(fā)現(xiàn)自己理解的局限性,確實delegateevent有很多的相似之處,并且delegate完全能實現(xiàn)event的功能。但我并未認證考慮為什么微軟要設(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>

      因此我認為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所做的封裝了。

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


安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
国产精品一区二区精品_久久小视频_天堂va在线观看_99久久夜色精品国产亚洲96_日本手机在线视频_av成人免费
<button id="0mgmq"><pre id="0mgmq"></pre></button>
  • <tr id="0mgmq"></tr>
  • <abbr id="0mgmq"><source id="0mgmq"></source></abbr> <button id="0mgmq"></button>
  • 一区二区精品在线| 久久精品一本| 亚洲国产精品久久久久久女王| 亚洲精品电影在线一区| 伊人久久大香线蕉午夜av| 在线视频不卡一区二区三区| 亚洲国产精品一区二区第四页av| 亚洲欧美春色| 免费精品视频一区| 亚洲午夜精品福利| 欧美日韩国内| 国产色综合网| aa日韩免费精品视频一| 精品一区二区三区国产| 午夜精品美女久久久久av福利| 欧美一区在线看| 99国产精品久久久久久久| 久久精品中文| 久久99欧美| 欧美777四色影| 国产精品久久久一区二区三区 | 中文字幕久精品免| 国产精品二区三区四区| 欧美在线91| 国产欧美日韩综合精品二区| 91久久精品国产91久久性色tv| 久久精品一区二区三区不卡免费视频| 日本一区二区三区精品视频| 亚洲天堂男人| 大波视频国产精品久久| 在线日韩av永久免费观看| 精品999日本| 激情小说综合网| 欧美午夜电影在线观看| 麻豆久久久9性大片| 色综合久久久久久久久五月| 亚洲精品社区| 97在线资源站| 欧美日韩国产一区精品一区| av一区观看| 久久久久成人精品免费播放动漫| 亚洲自拍偷拍二区| 91视频最新| 制服诱惑一区| 国产一区二区三区av在线| 欧美一区二区在线| 国产精品一区免费观看| 日韩一区国产在线观看| 亚洲永久在线| 亚洲视频中文| 日韩欧美国产二区| 99re在线观看| 亚洲高清久久| 亚洲美女搞黄| 一本色道久久综合亚洲精品婷婷| 欧美一区2区三区4区公司二百 | 日韩欧美一区二区三区四区| 亚洲一区日韩| 欧美日韩天天操| 俄罗斯精品一区二区| 激情久久综合| 一区二区av| 黄色91av| 久久综合九色99| 亚洲国产精品毛片| 手机看片福利永久国产日韩| 老牛嫩草一区二区三区日本 | 国产超碰91| 国产亚洲欧美一区二区| 影音欧美亚洲| 欧美18视频| 成人动漫视频在线观看免费| 亚洲精品影院在线观看| 一区二区三区四区欧美| 久久久综合香蕉尹人综合网| 米奇777在线欧美播放| 国产精品初高中精品久久| 色播亚洲婷婷| 麻豆视频成人| 久久精品首页| 国产亚洲网站| 亚洲精品一区国产精品| 日本免费高清一区| 国产精品国产一区二区| 母乳一区在线观看| 亚洲麻豆视频| 国产欧美日韩视频一区二区三区| 亚欧美中日韩视频| 国产视频一区在线观看一区免费| 亚洲网址在线| 亚洲图片在线观看| 黑人另类av| 国产日韩欧美一区二区| 国产精品制服诱惑| a级国产乱理论片在线观看99| 久久都是精品| 99re6在线| 国产91精品入口17c| 国产免费一区二区三区| 国产日韩精品推荐| 成人h视频在线观看| 国产精品美女久久久久av福利| av资源一区二区| 国产69精品久久久久9999apgf| 91久久精品一区二区别| 国产精品一区在线播放| 久久久久综合一区二区三区| 日本一区二区三区精品视频| 神马影院我不卡| 中文字幕中文字幕99 | 亚洲大胆视频| 国产深夜精品| 91精品国产高清久久久久久91裸体 | 亚洲清纯自拍| 国产精品国产三级欧美二区| 婷婷五月色综合| 99国产精品私拍| 精品久久中出| 亚洲性感美女99在线| 96久久精品| 欧美成人日本| 91国产在线播放| 午夜精品国产| 成人精品一二区| 亚洲午夜激情| 麻豆久久精品| 午夜日韩av| 国产欧美日韩伦理| 亚洲午夜一级| 久久精品日韩| 国产精品久久久久毛片大屁完整版| 国产伦精品一区二区三区照片 | 先锋影音一区二区三区| 日韩视频精品| 久久精品官网| 一区二区日本伦理| 不卡日韩av| 伊人影院久久| 欧美日韩精品一区| 先锋影音久久久| 午夜精品999| 你懂的网址一区二区三区| 国产精品视频久久一区| 色女孩综合网| 成人9ⅰ免费影视网站| 国产综合久久| 视频一区二区在线观看| 久久夜色精品| 黄色国产精品一区二区三区| 欧美激情第一页在线观看| 亚洲欧美日韩在线综合| 欧美日韩高清免费| 欧美日韩视频在线一区二区观看视频| 一区二区黄色| 欧美日韩理论| 亚洲国产精品一区二区第四页av| 99re在线观看| 亚洲中午字幕| 亚洲激情成人| 亚洲欧美影院| 日韩欧美精品一区二区三区经典| 久久激情综合| 国产情侣久久| 亚洲私人影院| 亚洲成人av动漫| 免费久久久一本精品久久区| 99re视频| 亚洲免费在线精品一区| 亚洲第一在线综合在线| 欧美日本亚洲| 亚洲色图自拍| 亚洲精品美女久久7777777| 久久久精品动漫| 国产一区二区三区黄| 51国产成人精品午夜福中文下载| 在线视频精品| 国产一区二区高清| 在线看片欧美| 亚洲国产成人不卡| 国内精品嫩模av私拍在线观看| 中文字幕剧情在线观看一区| 亚洲乱码一区二区三区三上悠亚| 日本一区二区三不卡| 欧美日韩精品免费看| 欧美一区二区三区精美影视| 六十路精品视频| 欧美深深色噜噜狠狠yyy| 日韩av电影免费播放| 日韩电影免费观看高清完整| 三区精品视频观看| 一区二区三区视频在线播放| 欧美a级一区| 亚洲婷婷免费| 国产日韩欧美二区| 久久亚洲免费| 久久精品ww人人做人人爽| 欧美一进一出视频| 一区二区三区四区欧美| 亚洲亚洲精品三区日韩精品在线视频| 亚洲午夜91|