程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#委托和事件,

c#委托和事件,

編輯:C#入門知識

c#委托和事件,


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

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

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

  是不是和接口很相似啊?

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

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

//定義一個委托
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());
        }
    }
}

  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved