简单委托使用

委托在打印的时候会被编译成一个类,因为Delegate就是一个类,所以在任何可以声明类的地方都可以声明委托。

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

namespace DelegateDeep
{
    class Program
    {
        //声明委托,相当于声明一个新的变量类型。(int、string等就是不同的变量类型)
        public delegate void DelegateHandler();

        //定义实现委托的方法
        public static void SayHelloChinese()
        {
            Console.WriteLine("你好啊!");
        }

        //定义实现委托的方法
        public static void SayHelloEnglish()
        {
            Console.WriteLine("Hello!");
        }

        static void Main(string[] args)
        {

            //实现一个委托,并传入一个方法
            DelegateHandler testDelegate = new DelegateHandler(SayHelloChinese);

            //使用委托
            testDelegate();

            //给委托添加方法
            testDelegate += SayHelloEnglish;

            //使用委托
            testDelegate();

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

namespace DelegateDeep
{
    class Program
    {
        //定义委托,它定义了可以代表的方法的类型,可以理解成,聲明了一個新的變量類型。
        public delegate void GreetingDelegate(string name);

       
            private static void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning" + name);
            }

            private static void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好," + name);
            }

            //這裡申明一個GreetingDelegate類型的方法,可以傳遞方法。這裡的GreetingDelegate,可以說是一個中轉,也可以用別的方式實現。
            private static void GreetPeople (string name, GreetingDelegate MakeGreeting)
            {
                MakeGreeting(name);
            }

            static void Main(string[] args)
            {
                GreetPeople("Jimmy Zhang", EnglishGreeting);
                GreetPeople("張子陽", ChineseGreeting);
                Console.ReadKey();
            }
        }
}

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

namespace DelegateDeep
{
    class Program
    {
        //定义委托,它定义了可以代表的方法的类型,可以理解成,聲明了一個新的變量類型。
        public delegate void GreetingDelegate(string name);

       
            private static void EnglishGreeting(string name)
            {
                Console.WriteLine("Morning" + name);
            }

            private static void ChineseGreeting(string name)
            {
                Console.WriteLine("早上好," + name);
            }

            //這裡申明一個GreetingDelegate類型的方法,可以傳遞方法。這裡的GreetingDelegate,可以說是一個中轉,也可以用別的方式實現。
            private static void GreetPeople (string name, GreetingDelegate MakeGreeting)
            {
                MakeGreeting(name);
            }
            
            static void Main(string[] args)
            {
                GreetingDelegate delegate1, delegate2;
                delegate1 = ChineseGreeting;
                delegate2 = EnglishGreeting;
                //這裡delegate1,相當於傳遞以一個參數進入裡面,例如string a,傳遞a進去。
                GreetPeople("Jimmy Zhang", delegate1);
                GreetPeople("張子陽", delegate2);

            //使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用所有绑定的方法。
                delegate1 += EnglishGreeting;
                GreetPeople("張子陽", delegate1);
        }
    }
}

Event封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。事件其实没什么不好理解的,声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。

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

namespace DelegateDeep
{
    public class Heater
    {
        //聲明溫度
        private int temperature;

        //相當于聲明一個變量類型,這個變量類型叫做BoilHandler,是一個委託
        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)
                {
                    //如果有對象註冊,則調用所有註冊對象的方法
                    if (BoilEvent != null)
                    {
                        BoilEvent(temperature);
                    }
                }
            }
        }
    }

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

    //顯示器
    public class Display
    {
        public  static void ShowMsg(int param)
        {
            Console.WriteLine("顯示器:水已經燒開,當前溫度:{0}。", param);
        }
    }

    class Program
    {


        static void Main(string[] args){

            Heater heater = new Heater();

            Alarm alarm = new Alarm();
            //這裡是給委託註冊方法
            heater.BoilEvent += alarm.MakeAlert;
            
            heater.BoilEvent += Display.ShowMsg;

            heater.BoilWater();
        }
    }

}