免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

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

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

1.事件原理:

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

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

               2、關(guān)于winform我們?cè)谝院髸?huì)詳細(xì)講解。

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

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

解釋: Object sender EventArgs e

   (1)第一個(gè)參數(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是它的一個(gè)控件,Click 是button預(yù)定義的一個(gè)標(biāo)準(zhǔn)事件

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

 System.EventHandler

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

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

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

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

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

2.委托

(1)委托是一個(gè)類.  

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

(3)幫助決定在運(yùn)行時(shí)調(diào)用哪個(gè)方法  

(4)步驟 –

1.   定義委托

2.   實(shí)例化委托

3.   使用委托

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

 1 1-->委托實(shí)例化:
 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 //實(shí)例化委托1(乘法)
16  CallFun DelegateObj1=new CallFun(MathsOprations.MulFun);
17  //實(shí)例化委托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  //實(shí)例化委托1(乘法)
36  CallFun DelegateObj1=new CallFun(MathsOprations.MulFun);
37  //使用委托
38  Console.WriteLine(DelegateObj1(2, 4));
39  //實(shí)例化委托2(除法)
40  CallFun DelegateObj2 = new CallFun(MathsOprations.DivFun);
41  //使用委托
42  Console.WriteLine(DelegateObj2(4, 2));
43  Console.ReadLine();
44

3.多播委托:

一個(gè)委托中可有多個(gè)方法

   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);
        }
    }
//實(shí)例化委托
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#中的事件,對(duì)象可以將關(guān)于事件或已發(fā)生變化的信息通知其他對(duì)象把事件信息通知其他對(duì)象的對(duì)象稱為發(fā)布方注冊(cè)到事件的對(duì)象稱為訂戶
步驟
    1.定義事件
    2.給對(duì)象預(yù)訂該事件
    3.通知事件的訂戶

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

自定義事件: 

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

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

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

      public event UserRequest OnUserRequest;

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

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

     private void ShowMessage(object sender,EventArgs e)

      {

          Console.WriteLine("HaHa!!");

      }

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

     public Client(UserInputMonitor m)

     {

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

}

好了,我們下面來運(yùn)行它了,

(1)首先得實(shí)例化UserInputMonitor類

     UserInputMonitor monitor=new UserInputMonitor();

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

     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 //定義一個(gè)委托,可以放在類外,也可以放在類內(nèi),好像一個(gè)方法指針,包含指定的事件發(fā)生對(duì)象和描述事件本身的事件對(duì)象
7 public delegate void UserRequest(object sender, EventArgs e);
8
9 public class UserInputMonitor
10 {
11
12 //自定義一個(gè)事件,不是系統(tǒng)本身的,如click!,要放在類內(nèi),而且必須指定委托
13 public event UserRequest OnUserRequest;
14 //定義一個(gè)死循環(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 //在這里使用這個(gè)事件,格式就是委托的格式,事件發(fā)生人就是本類,新實(shí)例化一個(gè)空事件類傳遞參數(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 //定義一個(gè)方法
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 //實(shí)例化監(jiān)聽對(duì)象
49 UserInputMonitor monitor = new UserInputMonitor();
50 //實(shí)例化客戶端,實(shí)現(xiàn)訂閱
51 Client aa = new Client(monitor);
52 //運(yùn)行
53 monitor.Run();
54 }
55 }
56 }
57
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
淺析C#的事件處理和自定義事件
delegate event
C#委托(delegate、Action、Func、predicate)和事件
對(duì)于“委托”的解釋摘錄(五)
C# 事件監(jiān)聽 實(shí)現(xiàn)
通俗的事件委托解釋
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服