C#中委託

委託是一種安全地封裝方法的類型,它與 C 和 C++ 中的函數指針相似。與 C 中的函數指針不一樣,委託是面向對象的、類型安全的和保險的。一個委託類型是表明與特定參數列表和返回類型的方法的引用類型。實例化委託時,能夠將其實例與具備兼容簽名和返回類型的任何方法相關聯。您能夠經過委託實例調用(或調用)該方法。委託用於將方法做爲參數傳遞給其餘方法。事件處理程序只不過是經過委託調用的方法。您能夠建立自定義方法,而且諸如Windows控件之類的類能夠在發生特定事件時調用您的方法。html

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

namespace Ch1
{
//靜態方法
    public delegate void GreetingDelegate(string name);//委託

    public class FirstDelegate
    {
        public static void GreetingChinese(string name)
        {
            Console.WriteLine("早上好:" + name);
        }

        public static void GreetingEnglish(string name)
        {
            Console.WriteLine("Good morning:" + name);
        }
    }

    public class GreetingManager
    {
        public static GreetingDelegate MakeLanguageByDelegate;
        public static void GreetingPeople(string name)
        {
            if (MakeLanguageByDelegate != null)
            {
                MakeLanguageByDelegate(name);
            }
        }

        public static event GreetingDelegate MakeLanguageByEvent;//事件,無論是否是聲明爲public,它老是被聲明爲private

        public static void GreetingPeopleEvent(string name)
        {
            if (MakeLanguageByEvent != null)
            {
                MakeLanguageByEvent(name);
            }
        }

    }
//普通方法

    public class FirstDelegate1
    {
        public void GreetingChinese(string name)
        {
            Console.WriteLine("早上好:" + name);
        }

        public void GreetingEnglish(string name)
        {
            Console.WriteLine("Good morning:" + name);
        }
    }

    public class GreetingManager1
    {
        public GreetingDelegate MakeLanguageByDelegate;
        public void GreetingPeople(string name)
        {
            if (MakeLanguageByDelegate != null)
            {
                MakeLanguageByDelegate(name);
            }
        }

        public event GreetingDelegate MakeLanguageByEvent;

        public void GreetingPeopleEvent(string name)
        {
            if (MakeLanguageByEvent != null)
            {
                MakeLanguageByEvent(name);
            }
        }

    }

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

namespace Ch1
{
    /**
     * Observer模式定義對象間的一對多的依賴關係,當一個對象的狀態發生改變時, 全部依賴於它的對象都獲得通知並被自動更新。
     * 水燒開的時候通知報警器和顯示器
     * */
    public class WaterDelegate
    {
        private int temperature = 0;
        public delegate void BoilHandler(int param);//聲明委託
        public event BoilHandler BoilEvent;//聲明事件

        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature >= 95) //溫度大於95警告而且顯示溫度
                {
                    if (BoilEvent != null) //若是有對象註冊
                    {
                        BoilEvent(temperature); //調用全部註冊方法
                        Console.WriteLine("-----------------");
                    }
                }
            }
        }
    }

    //報警
    public class Alarm
    {
        public void MakeAlert(int temperature)
        {
            Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了:", temperature);
        }

        /**
         * .Net Framework中的委託與事件
         * 委託聲明原型中的Object類型的參數表明了Object,也就是監視對象,在本例中是 Heater(熱水器)。回調函數(好比Alarm的MakeAlert)能夠經過它訪問觸發事件的對象(Heater)。
         * EventArgs 對象包含了Observer所感興趣的數據,在本例中是temperature。
         * */
        public void MakeAlert(Object sender, BoiledEventArgs e)
        {
            Heater heater = (Heater)sender;
            Console.WriteLine("Alarm:{0} - {1}, 嘀嘀嘀,水已經 {2} 度了 ", heater.area, heater.type, e.temperature);
        }
    }

    //顯示
    public class Display
    {
        public static void ShowMessage(int temperature)
        {
            Console.WriteLine("Display:水快燒開了,當前溫度:{0}度。", temperature);
        }

        public static void ShowMessage(Object sender, BoiledEventArgs e)
        {
            Console.WriteLine("Display:水快燒開了,當前溫度:{0}度。", e.temperature);
            Console.WriteLine();
        }
    }

    public class Heater
    {
        private int temperature;

        public string area { get; set; }    //添加地區
        public string type { get; set; }   //添加類型

        public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);//委託
        public event BoiledEventHandler Boiled;//事件

        // 能夠供繼承自 Heater 的類重寫,以便繼承類拒絕其餘對象對它的監視
        protected virtual void OnBoild(BoiledEventArgs e)
        {
            if (Boiled != null) //若是有對象註冊
            {
                Boiled(this, e); //調用全部註冊方法
            }
        }

        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature >= 95) //溫度大於95警告而且顯示溫度
                {
                    BoiledEventArgs e = new BoiledEventArgs(temperature);
                    OnBoild(e);
                }
            }
        }
    }

    // 定義BoiledEventArgs類,傳遞給Observer所感興趣的信息
    public class BoiledEventArgs : EventArgs
    {
        public readonly int temperature;

        public BoiledEventArgs(int temperature)
        {
            this.temperature = temperature;
        }
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Ch1
{
    class Program
    {
        static void Main(string[] args)
        {
            //------------------------靜態處理方法------------------------
            //GreetingManager.MakeLanguageByDelegate = FirstDelegate.GreetingEnglish;
            //GreetingManager.GreetingPeople("jason hua");

            //GreetingManager.MakeLanguageByDelegate = FirstDelegate.GreetingChinese;
            //GreetingManager.GreetingPeople("傑");

            //GreetingManager.MakeLanguageByEvent += FirstDelegate.GreetingEnglish;
            //GreetingManager.GreetingPeopleEvent("Jason Hua");

            //GreetingManager.MakeLanguageByEvent += FirstDelegate.GreetingChinese;
            //GreetingManager.GreetingPeopleEvent("傑");

            //-----------------------普通處理方法-------------------------------
            //FirstDelegate1 fd = new FirstDelegate1();
            //GreetingManager1 gm = new GreetingManager1();
            //gm.MakeLanguageByDelegate = fd.GreetingEnglish;//註冊對象
            //gm.GreetingPeople("jason hua");

            //gm.MakeLanguageByDelegate = fd.GreetingChinese;//註冊對象
            //gm.GreetingPeople("傑");
            //Console.WriteLine();
            //gm.MakeLanguageByEvent += fd.GreetingEnglish;//註冊對象
            //gm.GreetingPeopleEvent("jason hua");

            //gm.MakeLanguageByEvent += fd.GreetingChinese;//註冊對象
            //gm.GreetingPeopleEvent("傑");

            //普通的項目中的例子
            //WaterDelegate wd = new WaterDelegate();
            //Alarm alarm = new Alarm();

            //wd.BoilEvent += alarm.MakeAlert;//註冊對象
            //wd.BoilEvent += Display.ShowMessage;//註冊靜態對象

            //wd.BoilWater();

            //仿微軟的事件與委託,項目中的小例子
            Heater heater = new Heater();
            Alarm alarm = new Alarm();

            heater.area = "河南";
            heater.type = "九陽";
            heater.Boiled += alarm.MakeAlert;
            heater.Boiled += Display.ShowMessage;

            heater.BoilWater();

            Console.ReadLine();
        }
    }
}

引言委託 和 事件在 .Net Framework中的應用很是普遍,然而,較好地理解委託和事件對不少接觸C#時間不長的人來講並不容易。它們就像是一道檻兒,過了這個檻的人,以爲真是太容易了,而沒有過去的人每次見到委託和事件就以爲內心別(biè)得慌,混身不自在。本文中,我將經過兩個範例由淺入深地講述什麼是委託、爲何要使用委託、事件的由來、.Net Framework中的委託和事件、委託和事件對Observer設計模式的意義,對它們的中間代碼也作了討論。設計模式

參看網址:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx安全

其餘的基礎功能

1.  C#高級功能(四)擴展方法和索引函數

2. C#高級功能(三)Action、Func,Tuplethis

3. C#高級功能(二)LINQ 和Enumerable類spa

4. C#高級功能(一)Lambda 表達式.net

5. C#中泛型的解釋(object,list,var,dynamic的區別)設計

6. C#中委託指針

7. C#和.NET版本對比code

相關文章
相關標籤/搜索