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

步步為營C#技術漫談五、事件與委托機制

編輯:C#入門知識

概述

     C#中的委托類似於C或C++中的函數指針。使用委托使程序員可以將方法引用封裝在委托對象內。然後可以將該委托對象傳遞給可調用所引用方法的代碼,而不必在編譯時知道將調用哪個方法。與C或C++中的函數指針不同,委托是面向對象,而且是類型安全的。

C#中的“事件”是當對象發生某些事情時,類向該類的客戶提供通知的一種方法。事件最常見的用途是用於圖形用戶界面;通常,表示界面中的控件的類具有一些事件,當用戶對控件進行某些操作(如單擊某個按鈕)時,將通知這些事件。

使用委托來聲明事件。委托對象封裝一個方法,以便可以匿名調用該方法。事件是類允許客戶為其提供方法(事件發生時應調用這些方法)的委托的一種方法。事件發生時,將調用其客戶提供給它的委托。
注明:委托是對方法的包裝 在不確定要調用什麼方法時候而又不能用抽象或者多態實現的時候用委托。
 

委托在Observer模式示例:

先創建PilotLamp.cs:


    public interface PilotLamp
    {
        /// <summary>
        /// green light
        /// </summary>
        void TurnOn();

        /// <summary>
        /// notice
        /// </summary>
        string Notice
        {
            get;
            set;
        }
    }

再創建DelegateEvent.cs:


   public delegate void  EventHandler();再創建TrafficLight.cs:


    public class TrafficLight : PilotLamp
    {
        public event EventHandler Notices;
        private string notice;

        #region GreenLight 成員

        public void TurnOn()
        {
            if (Notices != null)
                Notices();
        }

        public string Notice
        {
            get
            {
                return notice;
            }
            set
            {
                notice = value;
            }
        }

        #endregion
    }

 

再創建Driver.cs:


    public class Driver
    {
        private string Name;
        private PilotLamp greenLight;

        public Driver(string name, PilotLamp greenLight)
        {
            this.Name = name;
            this.greenLight = greenLight;
        }

        public void GoLeft()
        {
            Console.WriteLine(string.Format("{1}司機,{0},請向左開車.", greenLight.Notice, Name));
        }
    }

再創建Pedestrian.cs:


    public  class Pedestrian
    {
        private string Name;
        private PilotLamp greenLight;
        public Pedestrian(string name, PilotLamp greenLight)
        {
            this.Name = name;
            this.greenLight = greenLight;
        }
        public void  GoThrough()
        {
            Console.WriteLine(  string.Format("{0}同志,{1},請向前走.", Name, greenLight.Notice));
        }
    }

 

最後再調用:


    public partial class Run : Form
    {
        public Run()
        {
            InitializeComponent();
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            //-------------------------------------


            TrafficLight trafficLight = new TrafficLight();

            Driver driverOne = new Driver("張三", trafficLight);
            Driver driverTwo = new Driver("李四", trafficLight);

            Pedestrian pedestrianOne = new Pedestrian("王五", trafficLight);
            Pedestrian pedestrianTwo = new Pedestrian("麻六", trafficLight);

            trafficLight.Notices += new Observer.EventHandler(driverOne.GoLeft);
            trafficLight.Notices += new Observer.EventHandler(driverTwo.GoLeft);
            trafficLight.Notices += new Observer.EventHandler(pedestrianOne.GoThrough);
            trafficLight.Notices += new Observer.EventHandler(pedestrianTwo.GoThrough);
            trafficLight.Notice = "綠燈亮了.";
            trafficLight.TurnOn();

            //-------------------------------------

        }

    }

輸出時選控制台應用程序如圖:

image

結果如下圖:

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