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

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

    • 分享

      一步一步學(xué)習(xí)C#(五 委托與事件)

       orion360doc 2011-02-25

      一步一步學(xué)習(xí)C#(五 委托與事件)

      1.事件原理:

             在說明事件的原理之前,我們先來做一個例子,如下:

                     1、啟動VS,建立一個winform應(yīng)用程序,在form窗口中,我們建立一個按鈕,當(dāng)點擊這個按鈕時,彈出消息"you clicked me!"。

                     2、關(guān)于winform我們在以后會詳細(xì)講解。

                     3、我們雙擊按鈕后,在button1的click事件中的代碼如下: private void button1_Click(object sender, EventArgs e)        

      {             MessageBox.Show("you clicked me!");         } 這是一個完整的私有方法,參數(shù)為object sender和EventArgs e。

      解釋: Object sender EventArgs e

         (1)第一個參數(shù)sender是object基類,它表示了button1類本身,可以經(jīng)過顯式轉(zhuǎn)換為button1類.    (Button)sender  

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

      把方法和事件聯(lián)系起來:

         (1) 我們通過程序界面看到,代碼如下: this.button1.Click += new System.EventHandler(this.button1_Click);  

         (2)this表示類本身(即form)而button1是它的一個控件,Click 是button預(yù)定義的一個標(biāo)準(zhǔn)事件

         (3)通過 += 將 一個System.EventHandler(this.button1_Click)的方法賦給了click事件。

       System.EventHandler

          (1)System.EventHandler 就是一個系統(tǒng)預(yù)定義的委托。

          (2)該委托將事件與事件處理程序連接。

          (3)委托是一個定義簽名的類型,即方法的返回值類型和參數(shù)列表類型。

          (4)系統(tǒng)的委托聲明如下 public delegate void EventHandler( object sender , EventArgs e )     它定義了一個函數(shù)(方法)簽名的方式。

           (5)private void button1_Click(object sender, EventArgs e) 滿足此簽名方式: 一、沒有返回值 二、傳入?yún)?shù)

      2.委托

      (1)委托是一個類.  

      (2)它包含對方法的引用  

      (3)幫助決定在運行時調(diào)用哪個方法  

      (4)步驟 –

      1.   定義委托

      2.   實例化委托

      3.   使用委托

      (5)如上面的new System.EventHandler(this.button1_Click);

       1 1-->委托實例化:
       2 //定義委托
       3 public delegate int CallFun(int a, int b);
       4 class MathsOperations
       5 {
       6         public int MulFun(int a, int b)
       7         {
       8             return a * b;
       9         }
      10         public int DivFun(int a, int b)
      11         {
      12             return a / b;
      13         }
      14 }  
      15 //實例化委托1(乘法)
      16  CallFun DelegateObj1=new CallFun(MathsOprations.MulFun);
      17  //實例化委托2(除法)
      18   CallFun DelegateObj2 = new CallFun(MathsOprations.DivFun);
      19
      20 2-->委托使用:
      21 //定義委托
      22 public delegate int CallFun(int a, int b);
      23 class MathsOperations
      24 {
      25         public int MulFun(int a, int b)
      26         {
      27             return a * b;
      28         }
      29         public int DivFun(int a, int b)
      30         {
      31             return a / b;
      32         }
      33     }
      34
      35  //實例化委托1(乘法)
      36  CallFun DelegateObj1=new CallFun(MathsOprations.MulFun);
      37  //使用委托
      38  Console.WriteLine(DelegateObj1(2, 4));
      39  //實例化委托2(除法)
      40  CallFun DelegateObj2 = new CallFun(MathsOprations.DivFun);
      41  //使用委托
      42  Console.WriteLine(DelegateObj2(4, 2));
      43  Console.ReadLine();
      44

      3.多播委托:

      一個委托中可有多個方法

         Delegate string delegateTest(string s);

         delegateTest dt = new delegateTest(f1)

         delegateTest dt2 = new delegateTest(f3)

         dt = dt+dt2;

         dt += new delegateTest(f2)

      多播委托的使用:
      //定義委托
          public delegate void CallFun(int a, int b);
          class MathsOprations
          {
              public static int result;
              public static void MulFun(int i, int j)
              {
                  result = i * j;
              }
              public static  void DivFun(int i, int j)
              {
                  result = result *(i / j);
              }
          }
      //實例化委托
      CallFun DelegateObj = new CallFun(MathsOprations.MulFun);
      //多播委托
      DelegateObj += new CallFun(MathsOprations.DivFun);
      //調(diào)用多播委托
      DelegateObj(9, 3);
      System.Console.WriteLine("結(jié)果是:{0}", MathsOprations.result);
      Console.ReadLine();

      4.自定義事件

               使用C#中的事件,對象可以將關(guān)于事件或已發(fā)生變化的信息通知其他對象把事件信息通知其他對象的對象稱為發(fā)布方注冊到事件的對象稱為訂戶
      步驟
          1.定義事件
          2.給對象預(yù)訂該事件
          3.通知事件的訂戶

      我們可以通過自定義一個事件來進(jìn)一步了解事件與委托的處理原理:
      首先用一個死循環(huán)來模擬監(jiān)聽,我們把這個方法放入UserInputMonitor類中,當(dāng)然這是一個公共類:
      public void Run()
              {
                  //finished永遠(yuǎn)是false,所以永遠(yuǎn)循環(huán)
                  bool finished = false;
                  do
                  {
                      if (Console.ReadLine() == "h")
                      {
                          //在這里使用這個事件,格式就是委托的格式,事件發(fā)生人是本類,新實例化一個空事件類傳遞參數(shù)。
                          OnUserRequest(this, new EventArgs());
                      }
                  } while (!finished);
              }

      自定義事件: 

      (1)  定義一個委托,可以放在類外,也可以放在類內(nèi),好像一個方法指針,包含指定的事件發(fā)生對象和描述事件本身的事件對象

          public delegate void UserRequest(object sender, EventArgs e); 我們把它放在類外.

      (2)自定義一個事件,不是系統(tǒng)本身的,如click!,要放在類內(nèi),而且必須指定委托

            public event UserRequest OnUserRequest;

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

      我們還要定義一個Client類,在類中定義一個方法。

           private void ShowMessage(object sender,EventArgs e)

            {

                Console.WriteLine("HaHa!!");

            }

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

           public Client(UserInputMonitor m)

           {

            m.OnUserRequest+=new UserRequest(this.ShowMessage);

      }

      好了,我們下面來運行它了,

      (1)首先得實例化UserInputMonitor類

           UserInputMonitor monitor=new UserInputMonitor();

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

           Client aa = new Client(monitor);

      (3)最后讓monitor開始監(jiān)聽事件。

           monitor.run();

       代碼如下:

       

      1 using System;
      2  using System.Collections.Generic;
      3 using System.Text;
      4 namespace ConsoleApplication1
      5 {
      6 //定義一個委托,可以放在類外,也可以放在類內(nèi),好像一個方法指針,包含指定的事件發(fā)生對象和描述事件本身的事件對象
      7 public delegate void UserRequest(object sender, EventArgs e);
      8
      9 public class UserInputMonitor
      10 {
      11
      12 //自定義一個事件,不是系統(tǒng)本身的,如click!,要放在類內(nèi),而且必須指定委托
      13 public event UserRequest OnUserRequest;
      14 //定義一個死循環(huán)
      15 public void Run()
      16 {
      17 //finished永遠(yuǎn)是false,所以永遠(yuǎn)循環(huán)
      18 bool finished = false;
      19 do
      20 {
      21 if (Console.ReadLine() == "h")
      22 {
      23 //在這里使用這個事件,格式就是委托的格式,事件發(fā)生人就是本類,新實例化一個空事件類傳遞參數(shù)。
      24 OnUserRequest(this, new EventArgs());
      25 }
      26 } while (!finished);
      27 }
      28 }
      29 public class Client
      30 {
      31 public Client(UserInputMonitor m)
      32 {
      33 //訂閱方法
      34 m.OnUserRequest+=new UserRequest(this.ShowMessage);
      35 }
      36
      37 //定義一個方法
      38 private void ShowMessage(object sender, EventArgs e)
      39 {
      40 Console.WriteLine("HaHa!!");
      41 }
      42 }
      43
      44 class Program
      45 {
      46 static void Main()
      47 {
      48 //實例化監(jiān)聽對象
      49 UserInputMonitor monitor = new UserInputMonitor();
      50 //實例化客戶端,實現(xiàn)訂閱
      51 Client aa = new Client(monitor);
      52 //運行
      53 monitor.Run();
      54 }
      55 }
      56 }
      57

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多