• Delegate and event


    Here is a sample about delegate and event.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace TestHeaterDelegateSample
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                Heater heater = new Heater();
                Monitor monitor = new Monitor();
    
                //The below can be modified with the below solution1.
                //HeaterEventHander hander = new HeaterEventHander(monitor.OnBoil);
                //heater.HeaterEvent += hander;
                heater.HeaterEvent += new HeaterEventHander(monitor.OnBoil);
    
                heater.OnHeater();
    
                Console.ReadLine();
            }
        }
    
        public delegate void HeaterEventHander(object sender, HeaterEventArgs e); // EventArgs doesn't have real data.
    
        public class HeaterEventArgs : EventArgs
        {
            private string alertText;
            public string AlertText
            {
                get { return ("The Temperatur is 100 degree now."); }
              //  set { alertText = value; }
            }
        }
    
        public class Heater 
        {
            private int temperature;
            private string alterText;
    
            private int Temperature
            {
                get { return temperature; }
                set { temperature = value; }
            }
            private string AlterText 
            {
                get { return alterText; }
                set { alterText = value; }
            }
            public event HeaterEventHander HeaterEvent;
           
            public void OnHeater()
            {
                this.temperature = 0;
                for (;;Temperature++ )
                {
                    if (Temperature >= 100)
                    {
                        Console.WriteLine("Thie is the event sender.");
                        HeaterEventArgs e = new HeaterEventArgs();
                        HeaterEvent(this, e);
                        break;
                        // Raise the water has boiled.
                    }
                }
            }
        }
    
        public class Monitor
        {
            public void OnBoil(object sender, HeaterEventArgs e)
            {
                Console.WriteLine("The sender data is: "+e.AlertText);
                Console.WriteLine("The water has boiled. And we have monitored it.");
            }
        }
    }

     And the below is the msdn sample. It's more perfect and ofcourse more difficult.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace TestClockAlarmSample
    {
        // Class that contains the data for
        // the alarm event. Derives from System.EventArgs.
        //
        public class AlarmEventArgs : EventArgs
        {
            private bool snoozePressed;
            private int nrings;
    
            //Constructor.
            //
            public AlarmEventArgs(bool snoozePressed, int nrings)
            {
                this.snoozePressed = snoozePressed;
                this.nrings = nrings;
            }
    
            // The NumRings property returns the number of rings
            // that the alarm clock has sounded when the alarm event
            // is generated.
            //
            public int NumRings
            {
                get { return nrings; }
            }
    
            // The SnoozePressed property indicates whether the snooze
            // button is pressed on the alarm when the alarm event is generated.
            //
            public bool SnoozePressed
            {
                get { return snoozePressed; }
            }
    
            // The AlarmText property that contains the wake-up message.
            //
            public string AlarmText
            {
                get
                {
                    if (snoozePressed)
                    {
                        return ("Wake Up!!! Snooze time is over.");
                    }
                    else
                    {
                        return ("Wake Up!");
                    }
                }
            }
        }
    
        // Delegate declaration.
        //
        public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    
        // The Alarm class that raises the alarm event.
        //
        public class AlarmClock
        {
            private bool snoozePressed = false;
            private int nrings = 0;
            private bool stop = false;
    
            // The Stop property indicates whether the
            // alarm should be turned off.
            //
            public bool Stop
            {
                get { return stop; }
                set { stop = value; }
            }
    
            // The SnoozePressed property indicates whether the snooze
            // button is pressed on the alarm when the alarm event is generated.
            //
            public bool SnoozePressed
            {
                get { return snoozePressed; }
                set { snoozePressed = value; }
            }
    
            // The event member that is of type AlarmEventHandler.
            //
            public event AlarmEventHandler Alarm;
    
            // The protected OnAlarm method raises the event by invoking
            // the delegates. The sender is always this, the current instance
            // of the class.
            //
            protected virtual void OnAlarm(AlarmEventArgs e)
            {
                AlarmEventHandler handler = Alarm;
                if (handler != null)
                {
                    // Invokes the delegates.
                    handler(this, e);
                }
            }
    
            // This alarm clock does not have
            // a user interface.
            // To simulate the alarm mechanism it has a loop
            // that raises the alarm event at every iteration
            // with a time delay of 300 milliseconds,
            // if snooze is not pressed. If snooze is pressed,
            // the time delay is 1000 milliseconds.
            //
            public void Start()
            {
                for (; ; )
                {
                    nrings++;
                    if (stop)
                    {
                        break;
                    }
                    else
                    {
                        if (snoozePressed)
                        {
                            System.Threading.Thread.Sleep(1000);
                        }
                        else
                        {
                            System.Threading.Thread.Sleep(300);
                        }
                        AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings);
                        OnAlarm(e);
                    }
                }
            }
        }
    
        // The WakeMeUp class has a method AlarmRang that handles the
        // alarm event.
        //
        public class WakeMeUp
        {
            public void AlarmRang(object sender, AlarmEventArgs e)
            {
                Console.WriteLine(e.AlarmText + "
    ");
    
                if (!(e.SnoozePressed))
                {
                    if (e.NumRings % 10 == 0)
                    {
                        Console.WriteLine(" Let alarm ring? Enter Y");
                        Console.WriteLine(" Press Snooze? Enter N");
                        Console.WriteLine(" Stop Alarm? Enter Q");
                        String input = Console.ReadLine();
    
                        if (input.Equals("Y") || input.Equals("y"))
                        {
                            return;
                        }
                        else if (input.Equals("N") || input.Equals("n"))
                        {
                            ((AlarmClock)sender).SnoozePressed = true;
                            return;
                        }
                        else
                        {
                            ((AlarmClock)sender).Stop = true;
                            return;
                        }
                    }
                }
                else
                {
                    Console.WriteLine(" Let alarm ring? Enter Y");
                    Console.WriteLine(" Stop Alarm? Enter Q");
                    String input = Console.ReadLine();
                    if (input.Equals("Y") || input.Equals("y"))
                    {
                        return;
                    }
                    else
                    {
                        ((AlarmClock)sender).Stop = true;
                        return;
                    }
                }
            }
        }
    
    
        // The driver class that hooks up the event handling method of
        // WakeMeUp to the alarm event of an Alarm object using a delegate.
        // In a forms-based application, the driver class is the
        // form.
        //
        public class AlarmDriver
        {
            public static void Main(string[] args)
            {
                // Instantiates the event receiver.
                WakeMeUp w = new WakeMeUp();
    
                // Instantiates the event source.
                AlarmClock clock = new AlarmClock();
    
                // Wires the AlarmRang method to the Alarm event.
                clock.Alarm += new AlarmEventHandler(w.AlarmRang);
    
                clock.Start();
            }
        }
    }
    View Code
  • 相关阅读:
    【蜕变之路】第20天 UUID和时间戳的生成 (2019年3月10日)
    3.EntityFramework的多种记录日志方式,记录错误并分析执行时间过长原因(系列4)
    reactnative资源
    代码
    模板匹配模型、原型模型和区别性特征模型各自如何解释汉字的知觉
    mysqldatadir 转移
    mysql主从设置windows
    心灵鸡汤
    测试的发现遗漏BUG的做法
    汉字模式匹配的过程
  • 原文地址:https://www.cnblogs.com/bg57/p/3491472.html
Copyright © 2020-2023  润新知