C#从委托到Lambda表达式,我们应该知道的是——为什么?

  在上一篇博文发布之后,得到广大博友们的关注,本人甚感欣慰,对于博友们对我的鼓励和提出的一些建议,对我来说,都是很宝贵的,借用老外的一句话,“It means much to me”,呵呵,这篇文章,我们来谈谈lambda表达式给日常委托的使用中带来的便利。

  假如,要给公司的机房重地,安装一个自动化系统,硬件呢肯定不是我们所关心的,我们任务是要实现逻辑控制,也就是说,当该系统启动后,我们要执行相应的操作,简单点吧,比如打开电源,打开服务器和服务,这一过程,是我们需要执行的,那么,我们可以利用C#的委托来实现其基本逻辑,下面以控制台程序为例:

  首先,需要定义一个接口,该接口抽象出在机房能执行的操作,继承该接口的类,可以简单的分为打开,和关闭,这里我们就用OpenSomething或ShutdownSomething形象的表示,

  

    public interface IOperation
    {

    }

 

  public class OpenSomething : IOperation
  {
    
  }

为了不脱离本文主题,这里的接口只是一个形式,不添加任何代码,仅仅为了体现面象对向的编程思想。接着,我们需要定义一个Monitor的类,来表示监视器,用来控制和显示正在进行的操作

  public class Monitor
  {
      public delegate void OpenEventHandler();  //定义委托,用于实现自动化控制
  }

定义好类之后,就是写方法了,在OpenSomething中,我们写的方法其实就虚拟的表示实际的动作,比如打开电源,打开服务器之类的,如下

        /// <summary>
        /// 打开电源
        /// </summary>
        public void OpenPower()
        {
            Console.WriteLine("电源已开启.\r\n");
        }

        /// <summary>
        /// 打开服务器
        /// </summary>
        public void OpenServer()
        {
            Console.WriteLine("服务器已开启.\r\n");
        }

        /// <summary>
        /// 打开服务
        /// </summary>
        /// <param name="timeOut">设置超时时间(单位:秒)</param>
        public void OpenServices(int timeOut)
        {
            for (int i = timeOut; i > 0; i--)
            {
                Console.WriteLine("服务将在{0}秒后开启!\r\n",i);

                Thread.Sleep(1000);
            }
            Console.WriteLine("服务已经开启.\r\n");
        }

这样,我们就可以在主函数中写代码来执行了

    class Program
    {
        static void Main(string[] args)
        {
            Monitor.OpenEventHandler OnOpen;//定义一个委托变量

            OpenSomething openSomething = new OpenSomething();//实例化用于开启的对象

            OnOpen = openSomething.OpenPower;

            OnOpen += openSomething.OpenServer;

            OnOpen();

            Console.ReadKey();
        }
    }

程序在VS2008下编译通过并正确运行.

 

但是,我们可以看到,在OpenSomething方法中,OpenServices方法是需要传入参数的,而我们定义的委托是一个无参的,如果硬要把有参的函数引用传给无参的委托类型的变量,在编译期间是会报错了,这时,有两种方法会很容易出现在我们的脑海中:1,定义一个新的委托,可以接受一个int类型的参数  2,在OpenSomething中再加一个方法,该方法调用OpenServices,并传入一个给定的值,如下所示:

        /// <summary>
        /// 立即打开服务
        /// </summary>
        public void OpenServicesImediately()
        {
            OpenServices(0);//传入一个给定的值,0;
        }

然后主函数中可以把这个函数引用直接赋给委托变量。可是,这样的话,程序的灵活性将大大降低,如果需要不同的开启时间,可能就需要写不同的方法,这是我们不愿看到的,那该怎么办呢?

也许正是基于这一点吧,微软向广大.Net程序员推出了一种叫做Lambda表达式的新技术,利用它,我们就可以这样来做

    class Program
    {
        static void Main(string[] args)
        {
            Monitor.OpenEventHandler OnOpen;//定义一个委托变量

            OpenSomething openSomething = new OpenSomething();//实例化用于开启的对象

            OnOpen = openSomething.OpenPower;

            OnOpen += openSomething.OpenServer;

            OnOpen += () => openSomething.OpenServices(5);//依然是把方法的引用赋值给委托变量

            OnOpen();

            Console.ReadKey();
        }
    }

可以看到,第9行代码中,我们通过一个Lambda表达式,既可以给OpenServices方法传参,又可以把方法的引用传给委托,让委托来调用,是不是方便了很多呢.

运行结果:

 

分享了这一小小的知识点,希望对博友们有帮助,也希望园子里的朋友能给一些建议,让我等能学到更多的东西,提升自己。

转载于:https://www.cnblogs.com/Alex-bg/archive/2012/05/17/2506074.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值