国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

c#委托和事件

2019-11-17 03:23:12
字體:
來源:轉載
供稿:網友

c#委托和事件

  這兩天看到c#的委托和事件這一章,書上講得很簡單直接,但是java里沒得委托這個概念,在網上搜尋別人寫的相關資料,感覺大多都寫得太復雜了,或者就是直接講這東西怎么聲明,怎么定義,怎么實現,怎么用。看著更暈,知道怎么用,但是不知為何要用它,也不能夠去很好的理解它。

下面講講我個人的理解,也許不太準確,如果有理解錯誤的地方,希望看到的網友聯系本人,指正一下,互相幫助學習嘛~

委托:

  當我初看到委托的時候,我直接就想到了接口,來回憶一下接口。

  當我們要做什么事的時候,我們需要某個東西,我們要求這個東西要去做一些事,但是它要具體怎樣去做我們不知道也不關心,于是我們定義一個接口,里面全是抽象方法,用于告訴別人我們要求要做這些事。然后把接口扔給別人去具體實現。我們就只管調用接口就行了。

  我理解的委托也是這樣的,好比你要給自己修一座房子,你把設計圖紙畫好,然后扔給秘書,對他說“你去找些人來,讓他們給我把房子建好。”

  是不是和接口很相似啊?

  但是如果你就只想讓別人幫你做一件事就行了,而且那個人還可以做很多他自己的事,只在你要求他做的時候才需要他來做,定義一個接口是不是就顯得很沒有必要了呢?

  委托,是引用類型,指向方法。所以定義一個委托的時候,它看起來更像是在定義一個方法,而不同于定義一個類。

//定義一個委托public delegate int PlayMedia();//聲明一個委托實例public event PlayMedia playmedia;

  用delegate關鍵字來創建委托。

  event關鍵字告訴編輯器這個委托只能夠定義該委托的類調用,并且只能被其他類分別使用用+=和-=運算符來訂閱或者取消訂閱,當然這里也可以不要event關鍵字。

  委托的實現方法要和委托具有一樣的返回類型和簽名,但是非靜態方法和靜態方法都可以。

事件:

  事件其實就是委托,只不過委托可以是任何事,但是事件通常是指某些動作或者某些狀態改變之類,.net中的事件還有自己的規范。

  .net中的事件處理器通常返回void類型,并且取得兩個參數,第一個參數是定義委托的那個類的實例,第二個參數是一個EventArgs(事件數據的基類)的派生類對象。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace Consoleapplication1{    class PRogram    {        static void Main(string[] args)        {            Clock clock = new Clock();            //(實現委托)綁定事件            ClockA a = new ClockA();            a.Subscribe(clock);            ClockB b = new ClockB();            b.Subscribe(clock);            //調用clock的run方法            clock.Run();        }    }    /// <summary>    /// 事件參數類    /// </summary>    class TimeInfoEventArgs : EventArgs    {        public int Hour { get; set; }        public int Minute { get; set; }        public int Second { get; set; }        public TimeInfoEventArgs(int hour, int minute, int second)        {            this.Hour = hour;            this.Minute = minute;            this.Second = second;        }    }    /// <summary>    /// 時鐘類    /// </summary>    class Clock    {        //聲明一個私有變量用于存儲當前的秒鐘        private int second;        /// <summary>        /// 定義一個委托(秒鐘改變觸發事件)        /// </summary>        /// <param name="clock"></param>        /// <param name="e"></param>        public delegate void SecondChangeHandler(object clock, TimeInfoEventArgs e);        //聲明一個委托實例        public event SecondChangeHandler SecondChanged;        public void Run()        {            for (; ; )            {                //暫停100毫秒                Thread.Sleep(100);                //獲取當前系統時間                System.DateTime dt = System.DateTime.Now;                //如果秒鐘發生改變                if (dt.Second != second)                {                    //如果有訂閱者(事件觸發器)                    if (SecondChanged != null)                    {                        //通知訂閱者(觸發事件)                        SecondChanged(this, new TimeInfoEventArgs(dt.Hour, dt.Minute, dt.Second));                    }                    //改變存儲的秒鐘                    this.second = dt.Second;                }            }        }    }    class ClockA    {        //與clock類的委托綁定        public void Subscribe(Clock clock)        {            clock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);        }        public void TimeHasChanged(object clock, TimeInfoEventArgs e)        {            System.Console.WriteLine("SubscribeA Current Time : {0}:{1}:{2}", e.Hour.ToString(), e.Minute.ToString(), e.Second.ToString());        }    }    class ClockB    {        public void Subscribe(Clock clock)        {            clock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);        }        public void TimeHasChanged(object clock, TimeInfoEventArgs e)        {            System.Console.WriteLine("SubscribeB Current Time: {0}:{1}:{2}", e.Hour.ToString(), e.Minute.ToString(), e.Second.ToString());        }    }}

  


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 禹州市| 沙雅县| 绥化市| 保德县| 汝南县| 临夏市| 南岸区| 罗山县| 健康| 青田县| 特克斯县| 平安县| 大名县| 夏津县| 安远县| 彭水| 嵊州市| 吉林市| 廊坊市| 灵石县| 深水埗区| 涟水县| 馆陶县| 绥德县| 嘉鱼县| 海淀区| 岳阳市| 晋州市| 永安市| 彭泽县| 揭西县| 陕西省| 大同市| 襄汾县| 嘉义县| 新野县| 峨眉山市| 新绛县| 新绛县| 武穴市| 白银市|