public static void TestLocalVariables()
        {
            Console.WriteLine("***** Anonymous Methods *****\n");
            int aboutToBlowCounter = 0;

            // Make a car as usual.
            CarEventArgsTest c1 = new CarEventArgsTest("SlugBug", 100, 10);

            // Register event handlers as anonymous methods.
            c1.AboutToBlow += delegate
            {
                aboutToBlowCounter++;
                Console.WriteLine("Eek! Going too fast!");
            };

            c1.AboutToBlow += delegate(object sender, CarEventArgs e)
            {
                aboutToBlowCounter++;
                Console.WriteLine("Critical Message from Car: {0}", e.msg);
            };

            // This will eventually trigger the events.
            for (int i = 0; i < 6; i++)
            {
                c1.Accelerate(20);
            }

            Console.WriteLine("AboutToBlow event was fired {0} times.",
                              aboutToBlowCounter);
            Console.ReadLine();
        }
        /* It is possible to associate an event directly to a block of code statements at the time of event registration. Formally, such code
         * is termed an anonymous method
         */
        public static void TestEventsWithAnonymousMethods()
        {
            Console.WriteLine("***** Anonymous Methods *****\n");
            CarEventArgsTest c1 = new CarEventArgsTest("SlugBug", 100, 10);

            // Register event handlers as anonymous methods.
            c1.AboutToBlow += delegate
            {
                Console.WriteLine("Eek! Going too fast!");
            };

            c1.AboutToBlow += delegate(object sender, CarEventArgs e)
            {
                Console.WriteLine("Message from Car: {0}", e.msg);
            };

            c1.Exploded += delegate(object sender, CarEventArgs e)
            {
                Console.WriteLine("Fatal Message from Car: {0}", e.msg);
            };

            // This will eventually trigger the events.
            for (int i = 0; i < 6; i++)
            {
                c1.Accelerate(20);
            }

            Console.ReadLine();
        }
            public static void TestEventArgs()
            {
                Console.WriteLine("***** Fun with Events *****\n");
                CarEventArgsTest c1 = new CarEventArgsTest("SlugBug", 100, 10);

                // Register event handlers.
                c1.AboutToBlow += CarAboutToBlow;
                c1.Exploded    += CarExploded;

                Console.WriteLine("***** Speeding up *****");
                for (int i = 0; i < 6; i++)
                {
                    c1.Accelerate(20);
                }
                Console.ReadLine();
            }
        public static void RetrofitCarEventsWithLambdas()
        {
            Console.WriteLine("***** More Fun with Lambdas *****\n");

            // Make a car as usual.
            CarEventArgsTest c1 = new CarEventArgsTest("SlugBug", 100, 10);

            // Hook into events with lambdas!
            c1.AboutToBlow += (sender, e) => { Console.WriteLine(e.msg); };
            c1.Exploded    += (sender, e) => { Console.WriteLine(e.msg); };

            // Speed up (this will generate the events).
            Console.WriteLine("\n***** Speeding up *****");
            for (int i = 0; i < 6; i++)
            {
                c1.Accelerate(20);
            }

            Console.ReadLine();
        }