乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      談?wù)? 事件和委托

       昵稱10504424 2012-08-16

      相信大家在面試的時候會經(jīng)常問到事件和委托的區(qū)別,為什么.net中需要事件和委托這樣類似的問題吧,對于一些初學(xué)者來說可平時用的過程中也不知道為什么, 只知道這樣用,而對于其中的實現(xiàn)機制不是很清楚, 所以面試的時候總是感覺回答的不是很有底氣的, 對于委托和事件園子里面也有很多人寫過這樣的文章,比如張子陽博客中C# 中的委托和事件, 這篇文章由淺入深講解了.net中的事件和委托。所以比較建議初學(xué)者看看的,而且很容易懂.(本人第一次寫,如果什么地方說錯了的地方請大家海涵和及時糾正我)

      在張子陽的文章我相信已經(jīng)把事件和委托講的很清楚了,下面我說說我感覺需要注意的地方。

      為什么會有委托

      在C++中用函數(shù)指針來實現(xiàn)回調(diào)函數(shù)(回調(diào)函數(shù)是一種非常有用的編程機制),然而函數(shù)指針不是類型安全的, 所以.net Framework提供了稱為委托的類型安全的機制來實現(xiàn)函數(shù)的回調(diào)。

      編譯器如何解析委托

      當(dāng)我們像下面一樣在代碼中定義一個委托時,

      Public delegate void Comparator(int value1, int value2);

      但是編譯器遇到這行代碼會定義一個類:

       

      View Code
      復(fù)制代碼
       1 Public class Comparator:System.MulticastDelegate
       2 {
       3         public Comparator(Object object, IntPtr method);
       4 
       5         public virtual Void Invoke(Int32 value);
       6  
       7         public virtual IAsyncResult BeginInvoke(Int32 vlaue, AsyncCallback callback, Object object );
       8  
       9          public virtual void EndInvoke(IAsyncResult result);
      10 
      11 }
      復(fù)制代碼

      從上面代碼可以知道 委托 也是一個類,其中有一個構(gòu)造器,Invoke方法,BeginInvoke方法 和EndInvoke方法。構(gòu)造器有兩個參數(shù),對象引用傳給構(gòu)造器的Object參數(shù),方法的引用傳給method 參數(shù),對于靜態(tài)方法,會為Object 參數(shù)傳遞null.

       

      事件

      先看一個事件的定義:

       

        //定義事件委托(代理)
              public delegate void Comparator(int value1,int value2);
              //定義事件
              public event Comparator onComparator;

       

      編譯器在編譯事件的時候會把它轉(zhuǎn)換為三個構(gòu)造:

      復(fù)制代碼
              private Comparator onComparator = null;
      
              public void add_onComparator(Comparator value)
              { 
                  // 以一種線程安全的方式對事件添加一個委托
            }
              public void remove_onComparator(Comparator value)
              {
                  // 以一種線程安全的方式對事件移出一個委托
            }
      復(fù)制代碼

      從上面代碼可以看出第一部分是申明一個私有的委托字段, 后面兩部分是對這個委托字段的add訪問器和remove 訪問器,我們知道屬性中有g(shù)et 和set 訪問器,其實事件就是委托字段的訪問器,只是訪問器方法用add 和remove,而屬性用get和set.

      總結(jié):

       

      到這里我要講的差不多說完了, 這是我第一次寫文章,盡管上面的內(nèi)容理解的不是很深入,但是我只是想通過這樣的方式來鞏固自己看到的知識,因為我覺得這樣可以記錄下我不同時段對知識的理解以及寫的時候自己也在不斷思考,這樣會有利于對知識的理解。

      最后我為初學(xué)者推薦關(guān)于深入理解.net  Framework幾本書, 因為我感覺很多初學(xué)者不知道買什么書來學(xué)習(xí)。

      1.  CLR via C# (第三版) 作者:Jeffrey Richter (周靖譯) 清華大學(xué)出版社
      2.  深入理解C#(第2版)作者:Jon Skeet  周靖(譯)人民郵電出版

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多