Example #1
0
        static void Main(string[] args)
        {
            #region 委托示例1 (事件)
            ///* 项目场景描述:
            //* 我从明天早上开始要早起晨读,室友每天都七点起床晨跑,我告诉他明天起来的时候把我叫醒,并让我晨读
            //* PS:还有个王八犊子非要跟我赌五毛我起不来,还让明天室友也叫他,见证我到底有没有起来
            //*/

            ////首先你们三个得存在吧
            //var 中国好室友 = new 室友();
            //var 我 = new 要晨读的我();
            //var 王八犊子 = new 王八犊子();

            ////我先告诉室友:我要早起晨读
            //中国好室友.叫别人起床该干嘛干嘛 += 我.起床晨读;
            ////王八犊子来搅屎了
            //中国好室友.叫别人起床该干嘛干嘛 += 王八犊子.赌五毛起不来;
            ////于是第二天到了
            //Console.WriteLine("闹铃:早上七点钟...");
            //Console.WriteLine("系统提示:室友起床了!");
            //Console.WriteLine();
            //中国好室友.起床晨跑去();
            //Console.WriteLine();
            //Console.WriteLine("==========全剧终==========");
            #endregion
            Console.ReadLine();
            #region 委托示例2
            //GreetPeople("Jimmy Zhang", EnglishGreeting);
            //GreetPeople("张子阳", ChineseGreeting);//ChineseGreeting是实参
            //Console.ReadKey();
            #endregion
            #region 委托示例3
            //string name1, name2;
            //name1 = "Jimmy Zhang";
            //name2 = "张子阳";

            //GreetPeople(name1, EnglishGreeting);
            //GreetPeople(name2, ChineseGreeting);
            //Console.ReadKey();
            #endregion
            #region 委托示例4
            //GreetingDelegate delegate1, delegate2;
            //delegate1 = EnglishGreeting;
            //delegate2 = ChineseGreeting;

            //GreetPeople("Jimmy Zhang", delegate1);
            //GreetPeople("张子阳", delegate2);
            //Console.ReadKey();
            #endregion
            #region 委托示例5 用+=方式的委托,一次会执行所有+=过的方法
            //GreetingDelegate delegate1;
            //delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
            //delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

            //// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
            //GreetPeople("Jimmy Zhang", delegate1);
            //Console.ReadKey();
            #endregion
            #region 委托示例6 直接调用委托
            //GreetingDelegate delegate1;//事件的定义其实和这里类似,是对委托的一种实例化,进而实现+=,-=的注册方法
            #region 事件和委托的关系eg
            ////public delegate void delegate2(int param);   //把delegate2声明成委托类型
            ////public event delegate2 delegate3;            //把delegate3声明成一个delegate2类型的事件,这里的delegate3可以和delegate1具有相同的功能了(+=和-=)
            #endregion
            //delegate1 = EnglishGreeting; // 先给委托类型的变量赋值
            //delegate1 += ChineseGreeting;   // 给此委托变量再绑定一个方法

            //// 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
            //delegate1("Jimmy Zhang");
            //Console.ReadKey();
            #endregion

            #region 观察者模式 委托 热水器示例
            Heater heater = new Heater();
            Alarm  alarm  = new Alarm();

            heater.BoilEvent += alarm.MakeAlert;         //注册方法
            heater.BoilEvent += (new Alarm()).MakeAlert; //给匿名对象注册方法(效果同上)
            heater.BoilEvent += Display.ShowMsg;         //注册静态方法

            heater.BoilWater();                          //烧水,会自动调用注册过对象的方法
            Console.ReadLine();
            #endregion
        }
Example #2
0
        /// <summary>
        /// 使用委托可以将多个方法绑定到委托变量,当调用此变量时,可以一次调用所有绑定的方法
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            heater2 heater22 = new heater2();
            Alarm2 alarm2 = new Alarm2();
            //为Boiled 事件绑定方法
            heater22.Boiled += alarm2.MakeAlert;
            heater22.Boiled += (new Alarm2()).MakeAlert;
            heater22.Boiled += new heater2.BoiledEventHandler(alarm2.MakeAlert);
            heater22.Boiled += Display2.ShowMsg;
            heater22.BoilWater();

            //
            Heater heater = new Heater();
            Alarm alarm = new Alarm();
            heater.BoilEvent += alarm.MakeAlert;                //绑定事件
            heater.BoilEvent += (new Alarm()).MakeAlert;        //绑定事件
            heater.BoilEvent += Display.ShowMsg;
            
            heater.BoilWater();

           // heater.BoilWater();


            GreetingManager2 gm2 = new GreetingManager2();
            //gm2.MakeGreet = ChineseGeting;
            gm2.MakeGreet += EnglishGeting;
            gm2.GreetPeople("hello world");
            GreetingManager gm = new GreetingManager();
            gm.GreetPeople("Jim", EnglishGeting);
            gm.GreetPeople("章子怡", ChineseGeting);
            //GreetingDelegate gd1, gd2;
            gm.gd1 = EnglishGeting;
            gm.gd1 += ChineseGeting;
            gm.GreetPeople("John", gm.gd1);



           // GreetingDelegate gd1,gd2;
           // gd1 = EnglishGeting;//如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误。
           // gd1 += ChineseGeting;
           // GreetPeople("Jim",EnglishGeting);
           // GreetPeople("Jim2", gd1);
           // Console.WriteLine("***下面测试绑定的顺序和执行的顺序***");
           // gd2 = ChineseGeting;
           // gd2 += EnglishGeting;
           // gd2 += ChineseGeting;
           // gd2("章子怡");
           // Console.WriteLine("***测试结束***");
           // gd1-=EnglishGeting;
           //// gd1 -= ChineseGeting;将方法全部解除之后会产生错误
           // GreetPeople("章子怡", ChineseGeting);
           // gd1("zhang");
           // GreetPeople("Andy",sayHello);

            Console.WriteLine("\u0001");
            Console.WriteLine("\u0002");
            Console.WriteLine("\u0003");
            Console.WriteLine("\u0004");
            Console.WriteLine('Q');
            MyGenericDelegate<string> strTarget = new MyGenericDelegate<string>(StringTarget);
            strTarget("hello world");
        }