一、概念:

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

namespace EventDemo
{
    class Program
    {
        // 定义投票委托
        delegate void VoteDelegate(string name);

        static void Main(string[] args)
        {
            // 实例化委托对象
            //VoteDelegate votedelegate = new VoteDelegate(new Friend().Vote);

            // 使用匿名方法的代码
            // 匿名方法内联了一个委托实例(可以对照上面的委托实例化的代码来理解)
            // 使用匿名方法后,我们就不需要定义一个Friend类以及单独定义一个投票方法
            // 这样就可以减少代码量,代码少了,阅读起来就容易多了,以至于不会让过多的回调方法的定义而弄糊涂了
            VoteDelegate votedelegate = delegate(string nickname)
            {
                Console.WriteLine("昵称为:{0} 来帮Learning Hard投票了", nickname);
            };

            // 通过调用托来回调Vote()方法
            votedelegate("SomeBody");
            Console.Read();
        }
    }
}
View Code

二、使用匿名方法来忽略委托参数

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

namespace EventDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // Timer类在应用程序中生成定期事件
            System.Timers.Timer timer = new System.Timers.Timer();
            // 该值指示是否引发Elapsed事件
            timer.Enabled = true;
            // 设置引发Elapsed事件的间隔
            timer.Interval = 1000;
            // Elapsed事件是达到间隔时发生,前面设置了时间间隔为1秒,
            // 所以每一秒就会触发Elapsed事件,从而回调timer_Elapsed方法,输出当前的时间
            // timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            // 此时timer_Elapsed方法中的参数根本就不需要,所以我们可以使用匿名方法来省略委托参数
            // 省略了参数后我们的代码就更加简洁了,看的多舒服啊
            // 在开发WinForm程序中我们经常会用不到委托的参数,此时就可以使用匿名方法来省略参数
            timer.Elapsed += delegate
            {
                Console.WriteLine(DateTime.Now);
            };
            Console.Read();
        }
        public static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            Console.WriteLine(DateTime.Now);
        }
    }
}
View Code

三、在匿名方法中捕捉变量

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

namespace EventDemo
{
    class Program
    {
        // 定义闭包委托
        delegate void ClosureDelegate();

        static void Main(string[] args)
        {
            ClosureDelegate test = CreateDelegateInstance();
            test();

            Console.Read();
        }

        // 闭包延长变量的生命周期
        private static ClosureDelegate CreateDelegateInstance()
        {
            int count = 1;

            ClosureDelegate closuredelegate = delegate
            {
                Console.WriteLine(count);
                count++;
            };

            // 调用委托            
            closuredelegate();
            return closuredelegate;
        }
    }
}
View Code