亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

C#中的事件介紹

2020-01-24 02:12:12
字體:
來源:轉載
供稿:網友

事件

   語法

   訪問修飾符 event 委托名稱 事件名稱;

   定義事件:

復制代碼 代碼如下:

   public  delegate void delTest();

   public  event  delTest  eventTest;


   注冊事件(可以給一個事件注冊多個方法)
復制代碼 代碼如下:

   eventTest += new delTest(method1);

   eventTest += new delTest(method2);


 

自定義事件的基礎

    1.當一個結果發生時,有可能引起另外的一些反應。這就好像因果關系。而事件,則是這個因與果的內部聯系。
    2.在C#中,我們經常看到:

復制代碼 代碼如下:

private void button1_Click(object sender, EventArgs e)
{
 
        …………………….//代碼段
 
}

自定義事件的實例

從網上找了一個比較容易理解的自定義事件實例,記錄再次方便學習。原文地址://www.49028c.com/article/59459.htm

發布事件的類TestEventSource:

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventDemo
{
    /// <summary>
    /// 發布事件的類
    /// </summary>
    public class TestEventSource
    {
        //定義事件參數類
        public class TestEventArgs : EventArgs
        {
            public readonly char KeyToRaiseEvent;
            public TestEventArgs(char keyToRaiseEvent)
            {
                KeyToRaiseEvent = keyToRaiseEvent;
            }
        }
        //定義delegate
        public delegate void TestEventHandler(object sender, TestEventArgs e);
        //用event 關鍵字聲明事件對象
        public event TestEventHandler TestEvent;
        //事件觸發方法
        protected virtual void OnTestEvent(TestEventArgs e)
        {
            if (TestEvent != null)
                TestEvent(this, e);
        }
        //引發事件
        public void RaiseEvent(char keyToRaiseEvent)
        {
            TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
            OnTestEvent(e);
        }
    }
}

監聽事件的類TestEventListener

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventDemo
{
    /// <summary>
    /// 監聽事件的類
    /// </summary>
    public class TestEventListener
    {
        //定義處理事件的方法,他與聲明事件的delegate具有相同的參數和返回值類型
        public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
        {
            Console.WriteLine("發送者:{0},所按得健為:{1}", sender, e.KeyToRaiseEvent);
        }
        //訂閱事件
        public void Subscribe(TestEventSource evenSource)
        {
            evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
        }
        //取消訂閱事件
        public void UnSubscribe(TestEventSource evenSource)
        {
            evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
        }
    }
}

測試:

復制代碼 代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //創建事件源對象
            TestEventSource es = new TestEventSource();
            //創建監聽對象
            TestEventListener el = new TestEventListener();
            //訂閱事件
            Console.WriteLine("訂閱事件/n");
            el.Subscribe(es);
            //引發事件
            Console.WriteLine("輸入一個字符,再按enter鍵");
            string s = Console.ReadLine();
            es.RaiseEvent(s.ToCharArray()[0]);
            //取消訂閱事件
            Console.WriteLine("/n取消訂閱事件/n");
            el.UnSubscribe(es);
            //引發事件
            Console.WriteLine("輸入一個字符,再按enter健");
            s = Console.ReadLine();
            es.RaiseEvent(s.ToCharArray()[0]);
        }
    }
}

結果:

結論:

       TestEventSource類。他就相當于windows控件類一樣,是事件的源,里面包含有事件的聲明,以及存儲調用參數的事件參數類,以及事件的觸發方法。     

       TestEventListener類。他提供了事件處理程序,并實現了事件處理程序和事件對象的邦定,當然時間處理程序可以放在別處, 跟邦定程序(訂閱事件)放在一起便于理解和調用

       Test 類,實例化自定義事件的事件源對象,并調用 TestEventListener類中的Subscribe(es);方法進行事件對象和事件處理程序的邦定(訂閱事件),調用 TestEventSource類中的RaiseEvent(char keyToRaiseEvent)引發對象,并有對象所指定的委托回調處理事件。完成整個自定義事件。

       其中   RaiseEvent(char keyToRaiseEvent)  就相當于main()一樣是自定義事件的執行入口,  從這個法開始---〉調用事件委托----〉查找訂閱事件程序找到事件所封裝的方法集----〉由委托回調事件處理程序并傳遞參數---〉執行事件處理程序。

 

委托與事件總結

委托的作用:

占位,在不知道將來要執行的方法的具體代碼時,可以先用一個委托變量來代替方法調用(委托的返回值,參數列表要確定)。在實際調用之前,需要為委托賦值,否則為null。

事件的作用:

事件的作用與委托變量一樣,只是功能上比委托變量有更多的限制。(比如:1.只能通過+=或-=來綁定方法(事件處理程序)2.只能在類內部調用(觸發)事件。)

 

委托:類型安全的指向函數的指針

使用步驟


 1:聲明一個委托 delegate string DelString(string s)

   2:定義一個委托變量

      DelString del = new DelString(ToUpper)

      DelString del = ToUpper

   3:使用委托

      del(s);

匿名方法*

 

復制代碼 代碼如下:

DelString del = delegate(string s) {  Console.WriteLine(s);  }

多播委托

復制代碼 代碼如下:

   DelMath del = Add;

   del += Sub;   del = del + Sub;

   del += Mul;

   del -= Mul;

事件

   原理  定義一個事件的時候生成一個私有的委托

      通過生成的add和remove方法對委托注冊方法和移除方法

      調用事件的時候最終調用的是委托指向的方法

   使用步驟

      1:定義事件

復制代碼 代碼如下:

        public event EventHandler PlayOver;

      2:調用事件
復制代碼 代碼如下:

        if (PlayOver != null)

        {

           PlayOver(this, null);

        }


      3:外部注冊事件
復制代碼 代碼如下:

            Player1 p = new Player1("真的恨你");

            p.PlayOver += new PlayOverEventHandler(p_PlayOver);

            p.Play();


   EventHandler 事件委托

   EventArgs 事件源參數

事件是成員

    由于事件不是類型,所以我們不能使用對象創建表達式(new表達式)來創建它的對象

    事件必須聲明在類或結構中,和其他成員一樣

    我們不能在一段可執行代碼中聲明事件

    事件被隱式自動初始化為null

 

事件使用的標準模式的根本就是System命名空間聲明的EventHandler委托類型。EventHandler委托雷池的聲明如下面代碼所示。

     1.第一個參數用來保存觸發事件的對象的引用。由于是object類型,所以可以匹配任何類型的實例。

     2.第二個參數用來保存有關狀態對于應用程序來說是否合適的狀態信息。

     3.返回參數是void。

復制代碼 代碼如下:

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久的精品视频| 国产精品中文字幕在线观看| 在线中文字幕日韩| 国产精品久久久久久亚洲调教| 欧美极品xxxx| 国外成人性视频| 成人精品一区二区三区电影免费| 亚洲欧美日韩精品| 日韩中文字幕在线免费观看| 欧美在线视频免费播放| 亚洲精品456在线播放狼人| 久久国产精彩视频| 日韩av观看网址| 一本色道久久综合狠狠躁篇的优点| 色综久久综合桃花网| 亚洲成人黄色在线| 国产精品亚洲网站| 成人在线视频福利| 午夜精品久久久久久久99黑人| 九九九热精品免费视频观看网站| 日本精品久久中文字幕佐佐木| 欧美亚州一区二区三区| 久久综合伊人77777蜜臀| 欧美猛少妇色xxxxx| 亚洲va欧美va国产综合剧情| 欧美日韩国产一中文字不卡| 国模极品一区二区三区| 中文字幕欧美精品在线| 黑人精品xxx一区一二区| 国产精品视频免费在线观看| yellow中文字幕久久| 国产午夜精品美女视频明星a级| 欧美激情a∨在线视频播放| 国产精品va在线播放我和闺蜜| 日韩av大片在线| 欧美电影在线观看| 欧美久久精品一级黑人c片| 成人欧美一区二区三区在线湿哒哒| 欧美精品久久久久久久久| 久久久女人电视剧免费播放下载| 欧美成人中文字幕在线| 亚洲自拍小视频免费观看| 国产精品视频免费在线观看| 亚洲性线免费观看视频成熟| 亚洲成人三级在线| 亚洲综合在线小说| 中文字幕一区电影| 亚洲精品电影网在线观看| 精品动漫一区二区三区| 久久久久久国产精品久久| 国产91久久婷婷一区二区| 日韩va亚洲va欧洲va国产| 亚洲一区av在线播放| 久久中文字幕国产| 欧美日韩在线视频一区| 日韩中文在线中文网在线观看| 黄色成人在线播放| 亚洲无限乱码一二三四麻| 97国产suv精品一区二区62| 日韩成人在线免费观看| 91久久久久久久久久久| 亚洲天天在线日亚洲洲精| 色偷偷亚洲男人天堂| 久久99青青精品免费观看| 国产精品欧美激情在线播放| 亚洲一区999| 九九热99久久久国产盗摄| 欧美国产日韩中文字幕在线| 欧美成人精品一区二区| 最近2019中文字幕一页二页| 亚洲午夜国产成人av电影男同| 欧美激情视频免费观看| 国产精品第七影院| 国产精品久久久久9999| 91麻豆桃色免费看| 日韩美女av在线免费观看| 在线观看欧美日韩| 欧美精品videofree1080p| 日韩欧美国产黄色| 久久久精品影院| 欧美理论电影在线观看| 中文国产亚洲喷潮| 久久中国妇女中文字幕| 91性高湖久久久久久久久_久久99| 欧美老女人在线视频| 国产精品情侣自拍| 亚洲视频在线观看视频| 国产91色在线|免| 国产日本欧美在线观看| 成人免费高清完整版在线观看| 亚洲一区二区三区成人在线视频精品| 日韩专区在线播放| 久久影视三级福利片| 亚洲人成77777在线观看网| 亚洲v日韩v综合v精品v| 欧美猛交ⅹxxx乱大交视频| 夜夜狂射影院欧美极品| 久久精品夜夜夜夜夜久久| 日本久久久久亚洲中字幕| 韩国三级日本三级少妇99| 欧美视频13p| 这里精品视频免费| 亚洲男人天堂视频| 在线色欧美三级视频| 国产精品久久久久久超碰| 亚洲精品天天看| 欧美在线精品免播放器视频| 韩国精品美女www爽爽爽视频| 日韩精品欧美国产精品忘忧草| 日韩美女视频免费看| 4438全国成人免费| 亚洲综合中文字幕68页| 久久伊人色综合| 波霸ol色综合久久| 在线观看精品国产视频| 久久99亚洲精品| 欧美劲爆第一页| 亚洲精品国产电影| 最新91在线视频| 亚洲小视频在线| 亚洲国产精品电影在线观看| 中文字幕亚洲欧美一区二区三区| 日韩美女免费线视频| 91热精品视频| 最新国产精品亚洲| 日韩精品免费在线| 欧美日韩免费看| 欧美乱大交xxxxx| 国产欧美一区二区白浆黑人| 97视频在线观看播放| 日韩视频精品在线| 亚洲欧洲中文天堂| 国产精品91久久久久久| 久久天天躁日日躁| 国产91ⅴ在线精品免费观看| 国产精品美女网站| 97国产精品视频| 在线视频亚洲欧美| 国产精品视频自在线| 久久精品2019中文字幕| 亚洲美女性视频| 午夜剧场成人观在线视频免费观看| 国产精品久久久久91| 亚洲国产精彩中文乱码av| 成人97在线观看视频| 欧美性极品xxxx做受| 精品久久久国产| 欧美成人精品h版在线观看| 欧美性视频在线| 米奇精品一区二区三区在线观看| 国产成人在线视频| 国产美女扒开尿口久久久| 久久成人18免费网站| 国产精品久久久久久一区二区| 国内外成人免费激情在线视频| 久久露脸国产精品| 欧美成人精品h版在线观看| 日韩黄色高清视频| 欧美中文在线视频| 亚洲精品网址在线观看| 久久视频精品在线| 国产精品一二三视频| 在线观看国产欧美| 国产在线播放91|