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

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

    • 分享

      淺析C#的事件處理和自定義事件

       ShangShujie 2008-01-22

      淺析C#的事件處理和自定義事件

      一、了解C#中的預(yù)定義事件處理機(jī)制

          在寫代碼前我們先來熟悉.net框架中和事件有關(guān)的類和委托,了解C#中預(yù)定義事件的處理。

          EventArgs是包含事件數(shù)據(jù)的類的基類,用于傳遞事件的細(xì)節(jié)。

          EventHandler是一個委托聲明如下

               public delegate void EventHandler( object sender , EventArgs e )

          注意這里的參數(shù),前者是一個對象(其實(shí)這里傳遞的是對象的引用,如果是button1的click事件則sender就是button1),后面是包含事件數(shù)據(jù)的類的基類。

          下面我們研究一下Button類看看其中的事件聲明(使用WinCV工具查看),以Click事件為例。

               public event EventHandler Click;

          這里定義了一個EventHandler類型的事件Click

          前面的內(nèi)容都是C#在類庫中已經(jīng)為我們定義好了的。下面我們來看編程時(shí)產(chǎn)生的代碼。

              private void button1_Click(object sender, System.EventArgs e)
              {
                  ...
              }

          這是我們和button1_click事件所對應(yīng)的方法。注意方法的參數(shù)符合委托中的簽名(既參數(shù)列表)。那我們怎么把這個方法和事件聯(lián)系起來呢,請看下面的代碼。

              this.button1.Click += new System.EventHandler(this.button1_Click);

          把this.button1_Click方法綁定到this.button1.Click事件。

          下面我們研究一下C#事件處理的工作流程,首先系統(tǒng)會在為我們創(chuàng)建一個在后臺監(jiān)聽事件的對象(如果是 button1的事件那么監(jiān)聽事件的就是button1),這個對象用來產(chǎn)生事件,如果有某個用戶事件發(fā)生則產(chǎn)生對應(yīng)的應(yīng)用程序事件,然后執(zhí)行訂閱了事件的所有方法。

      二、簡單的自定義事件(1)

          首先我們需要定義一個類來監(jiān)聽客戶端事件,這里我們監(jiān)聽鍵盤的輸入。

          定義一個委托。

              public delegate void UserRequest(object sender,EventArgs e);

          前面的object用來傳遞事件的發(fā)生者,后面的EventArgs用來傳遞事件的細(xì)節(jié),現(xiàn)在暫時(shí)沒什么用處,一會后面的例子中將使用。

          下面定義一個此委托類型類型的事件

              public event UserRequest OnUserRequest;

          下面我們來做一個死循環(huán)

              public void Run()
           {
          bool finished=false;
          do
          {
           if (Console.ReadLine()=="h")
          {
          OnUserRequest(this,new EventArgs());
          }
          }while(!finished);
           }

          此代碼不斷的要求用戶輸入字符,如果輸入的結(jié)果是h,則觸發(fā)OnUserRequest事件,事件的觸發(fā)者是本身(this),事件細(xì)節(jié)無(沒有傳遞任何參數(shù)的EventArgs實(shí)例)。我們給這個類取名為UserInputMonitor。

         下面我們要做的是定義客戶端的類
          首先得實(shí)例化UserInputMonitor類

             UserInputMonitor monitor=new UserInputMonitor();

          然后我們定義一個方法。

             private void ShowMessage(object sender,EventArgs e)
            {
                Console.WriteLine("HaHa!!");
            }

           最后要做的是把這個方法和事件聯(lián)系起來(訂閱事件),我們把它寫到庫戶端類的構(gòu)造函數(shù)里。

           Client(UserInputMonitor m)
           {
            m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);
            //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);

            //注意這種寫法是錯誤的,因?yàn)槲惺庆o態(tài)的

           }

           下面創(chuàng)建客戶端的實(shí)例。

               new Client(monitor);

           對了,別忘了讓monitor開始監(jiān)聽事件。

              monitor.run();

           大功告成,代碼如下:

      using System;
      class UserInputMonitor
      {
      public delegate void UserRequest(object sender,EventArgs e);
      //定義委托
      public event UserRequest OnUserRequest;
      //此委托類型類型的事件
      public void Run()
      {
      bool finished=false;
      do
      {
      if (Console.ReadLine()=="h")
      {
      OnUserRequest(this,new EventArgs());
      }
      }while(!finished);
      }
      }
      public class Client
      {
      public static void Main()
      {
      UserInputMonitor monitor=new UserInputMonitor();
      new Client(monitor);
      monitor.Run();
      }
      private void ShowMessage(object sender,EventArgs e)
      {
      Console.WriteLine("HaHa!!");
      }
      Client(UserInputMonitor m)
      {
      m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);
      //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);
      //注意這種寫法是錯誤的,因?yàn)槲惺庆o態(tài)的
      }
      }

      三、進(jìn)一步研究C#中的預(yù)定義事件處理機(jī)制

          可能大家發(fā)現(xiàn)在C#中有些事件和前面的似乎不太一樣。例如

            private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
            {

            }

            this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);

          這里使用了KeyPressEventArgs而不是EventArgs作為參數(shù)。這里使用了KeyEventHandler委托,而不是EventHandler委托。

          KeyPressEventArgs是EventArgs的派生類,而KeyEventHandler的聲明如下

            public delegate void KeyEventHandler( object sender , KeyEventArgs e );

         是參數(shù)為KeyEventArgs的委托。那為什么KeyPress事件要這么做呢,我們可以從兩個類的構(gòu)造函數(shù)來找答案。

             public EventArgs();

             public KeyPressEventArgs(char keyChar);

          這里的keyData是什么,是用來傳遞我們按下了哪個鍵的,哈。

          我在KeyEventArgs中又發(fā)現(xiàn)了屬性

             public char KeyChar { get; }

          進(jìn)一步證明了我的理論。下面我們來做一個類似的例子來幫助理解。

      四、簡單的自定義事件(2)

          拿我們上面做的例子來改。

          我們也定義一個EventArgs(類似KeyEventArgs)取名MyEventArgs,定義一個構(gòu)造函數(shù)public MyEventArgs(char keyChar),同樣我們也設(shè)置相應(yīng)的屬性。代碼如下

      using System;
      class MyMyEventArgs:EventArgs
      {
      private char keyChar;
      public MyMyEventArgs(char keyChar)
      {
      this.keychar=keychar;
      }
      public char KeyChar
      {
      get
      {
      return keyChar;
      }
      }
      }

      因?yàn)楝F(xiàn)在要監(jiān)聽多個鍵了,我們得改寫監(jiān)聽器的類中的do...while部分。改寫委托,改寫客戶端傳遞的參數(shù)。好了最終代碼如下,好累

      using System;
      class MyEventArgs:EventArgs
      {
      private char keyChar;
      public MyEventArgs(char keyChar)
      {
      this.keyChar=keyChar;
      }
      public char KeyChar
      {
      get
      {
      return keyChar;
      }
      }
      }
      class UserInputMonitor
      {
      public delegate void UserRequest(object sender,MyEventArgs e);
      //定義委托
      public event UserRequest OnUserRequest;
      //此委托類型類型的事件
      public void Run()
      {
      bool finished=false;
      do
      {
      string inputString= Console.ReadLine();
      if (inputString!="")
      OnUserRequest(this,new MyEventArgs(inputString[0]));
      }while(!finished);
      }
      }
      public class Client
      {
      public static void Main()
      {
      UserInputMonitor monitor=new UserInputMonitor();
      new Client(monitor);
      monitor.Run();
      }
      private void ShowMessage(object sender,MyEventArgs e)
      {
      Console.WriteLine("捕捉到:{0}",e.KeyChar);
      }
      Client(UserInputMonitor m)
      {
      m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);
      //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);
      //注意這種寫法是錯誤的,因?yàn)槲惺庆o態(tài)的
      }
      }

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多