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 + "\n");



            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

 

你可能感兴趣的:(delegate)