频道栏目
首页 > 资讯 > C# > 正文

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

12-05-18        来源:[db:作者]  
收藏   我要投稿

在上一篇博文发布之后,得到广大博友们的关注,本人甚感欣慰,对于博友们对我的鼓励和提出的一些建议,对我来说,都是很宝贵的,借用老外的一句话,“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>
        /// 立即打开服务 www.2cto.com
        /// </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方法传参,又可以把方法的引用传给委托,让委托来调用,是不是方便了很多呢.
运行结果:
 

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

 

 

摘自 白光

相关TAG标签
上一篇:fedora 14 root不能登陆修改方法
下一篇:查看oracle表空间的使用情况
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站