<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      委托的雜七雜八---《clr via c#》筆記

      2012-01-31 22:35  海不是藍  閱讀(477)  評論(0)    收藏  舉報

       

      初識委托

      委托提供了一種回調的函數機制,委托確保回調的方法是類型安全的,clr最重要的目標之一是類型安全。

      非托管的c/c++中回調函數只是個內存地址。

      blah blah blah......

      什么委托基本語法啊,什么委托回調靜態回調實例方法啊!啊!啊!

      blah blah blah......

      blah blah blah......

      blah blah blah......

       

      委托揭秘

      定義一個委托clr所做的幕后工作

      public delegate void Mydelegate(Int32 i);

      編譯器生成的代碼

      public class Mydelegate : System.MulticastDelete

      {

          public Mydelegate(Int32 i, IntPtr method);   

          public virtual string Invoke(Int32 i);

          public virtual IAsyncResult BeginResult(Int32 i, AsyncCallback callback, Object object);

          public virtual void EndInvoke(IAsyncResult result);

      }

       

      委托的繼承關系

      我們的委托繼承--->System.MulticastDelete

      System.MulticastDelete繼承--->System.Delegate

      System.Delegate繼承--->System.object

       

      委托放到什么地方?

      有些人把委托放到和class同級的地方,也就是全局,有些人把委托放到class里面,到底怎么放才對?

      Jeffrey說:"隨便你娃怎么放!你可以把它嵌套到類型中!你也可以把他放到全局范圍中定義!委托是類,能夠定義類的地方都可以定義委托。"


      委托的可訪問性

      1.把委托放到全局范圍,和class同級

      public delegate void Mydelegate(Int32 i);

      class Program

      {

          static void Main(){}

      }

      這個時候il代碼


      所以種情況委托是公開的。

      2.嘗試下把委托定義為私有的

      private delegate void Mydelegate(Int32 i);

      class Program

      {

          static void Main(){}

      }

      嘗試編譯代碼,但是編譯器報錯

      錯誤1命名空間中定義的元素無法顯式聲明為 private、protected 或 protected internal

      結果很悲劇!!!!

      3.把委托放到類里面

      class Program

      {

          public delegate void Mydelegate(Int32 i);

          static void Main() { }

      }

      這個時候委托是公開的,可以在其他地方調用這個委托

      public class a

      {

          public void test()

          {

              Program.Mydelegate my = test1;

              my(2);

          }

          public void test1(Int32 i) { Console.WriteLine(i); }

      }

      4.特殊的情況

          public class a

          {

              public delegate void Mydelegate(Int32 i);

              public event Mydelegate Myevent;

          }

      當類中有個委托類型的事件,那么外部就不能直接使用委托了,這個時候就相當于委托是字段,而事件是屬性。那么就體現了封裝性了。

      你可以試試在其它類中來訪問這個委托,完全不給你機會!只能通過事件。

       

      System.MulticastDelete

       

      由于所有委托類型都派生自System.MulticastDelete,逼不得已要研究它!!!

      它有3個重要的非公共字段,我們定義的委托類型繼承了這3個字段。

       

      字段

      類型

      說明

      _target

      System.Object

      委托對象包裝一個靜態方法的時候為null,實例方法的時候是回調方法要操作的對象,也就是實例方法的this值

      _methodPtr

      System.IntPtr

      一個內部整數值,clr用它標識要回調的方法

      _invocationLis

      System.Object

      一般是null,構造一個委托鏈時,它可以引用一個委托數組

       

      說了字段現在說說2個主要的屬性Target和Method

      Target返回一個引用,它指向回調方法要操作的對象。

      Method要回調方法的內存地址

       

      還有就是委托類型的Invoke方法,就是它去調用那個要回調的方法。

      委托對象 a,可以寫a();也可以直接去a.Invoke();

      我瘋了才去用a.Invoke(),浪費鍵盤壽命

       

      委托鏈

      童鞋們!委托的+=,-=是不是用得很爽,其實最開始沒得這個!讓你回到解放前

      public static Delegate Combine(Delegate a, Delegate b);

      上面那個就是+=的祖宗老大爺!

      public delegate void Mydelegate();

      class Program

      {

          static void Main()

          {

              Mydelegate my1 = new Mydelegate(test1);

              Mydelegate my2 = new Mydelegate(test2);

              Mydelegate my3 = new Mydelegate(test3);

              Mydelegate my = null;

              my = (Mydelegate)Delegate.Combine(my, my1);

              my = (Mydelegate)Delegate.Combine(my, my2);

              my = (Mydelegate)Delegate.Combine(my, my3);

              my();

              Console.WriteLine("------絲襪般的分割線------");

              my = (Mydelegate)Delegate.Remove(my, my1);

              my = (Mydelegate)Delegate.Remove(my, new Mydelegate(test2));

              my();

              Console.Read();

          }

          public static void test1() { Console.WriteLine("1"); }

          public static void test2() { Console.WriteLine("2"); }

          public static void test3() { Console.WriteLine("3"); }

      }

      上面的代碼就是委托鏈的解放前寫法!爽吧!

      偉大的微軟為了解放我們這些苦命的程序員,就搞了+=和-=這2個操作符。

       

      委托鏈不爽的地方!

      如果委托鏈中一個方法異常或者堵塞很久,那么后面的方法都沒法調用!所以默認的委托鏈調用算法不夠健壯。

      然后下面是Jeffrey的解決思路,擦 加了個try。我忍!

      public delegate void Mydelegate();

      class Program

      {

          static void Main()

          {

              a a1 = new a();

              Mydelegate my1 = new Mydelegate(a1.test1);

              Mydelegate my2 = new Mydelegate(a1.test2);

              Mydelegate my3 = new Mydelegate(a1.test3);

              Mydelegate my = null;

              my = (Mydelegate)Delegate.Combine(my, my1);

              my = (Mydelegate)Delegate.Combine(my, my2);

              my = (Mydelegate)Delegate.Combine(my, my3);

              Show(my);

              Console.Read();

          }

          static void Show(Mydelegate my)

          {

              foreach (Mydelegate d in my.GetInvocationList())

              {

                  try

                  {

                      d();

                  }

                  catch (InvalidOperationException e)

                  {

                      Console.WriteLine(e.Message);

                      Console.WriteLine(d.Target);

                  }

              }

          }

      }

      public class a

      {

          public void test1() { Console.WriteLine("1"); }

          public void test2() { Console.WriteLine("2"); }

          public void test3() { throw new InvalidOperationException("blah blah blah......"); }

      }

       

      委托與反射先欠著,我不是機器人

       

      ****************************

      祖賢今天45歲了。

       


      主站蜘蛛池模板: 40岁大乳的熟妇在线观看| 九九热在线视频免费播放| 久久精品国产亚洲av电影| 中文人妻无码一区二区三区在线| 亚洲色偷偷色噜噜狠狠99| 久久se精品一区精品二区国产| 成人精品天堂一区二区三区| 亚州中文字幕一区二区| 人妻另类 专区 欧美 制服| 开心激情站开心激情网六月婷婷| 欧洲亚洲国内老熟女超碰| 色猫咪av在线网址| 五月综合网亚洲乱妇久久| 在线中文一区字幕对白| 国产色无码专区在线观看| 国产一级r片内射免费视频| 国产成人精品2021欧美日韩| 88国产精品视频一区二区三区| 内射毛片内射国产夫妻| 伊人久久久av老熟妇色| 国产精品高清视亚洲精品| 久久精品国产一区二区三区不卡| h无码精品3d动漫在线观看| 91老肥熟女九色老女人| 日韩精品一区二区亚洲专区| 蚌埠市| 久久99精品久久久久久| 久久亚洲国产成人精品性色| 久久96热在精品国产高清| 华人在线亚洲欧美精品| 国产精品午夜福利在线观看| 亚洲精品电影院| 又黄又爽又色的少妇毛片| 在线日韩日本国产亚洲| 克山县| 一本大道久久香蕉成人网| 天天色综网| 亚洲成人动漫av在线| 久久精品国产亚洲av麻豆小说| 国产丝袜在线精品丝袜| 国产精品午夜福利精品|