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方法传参,又可以把方法的引用传给委托,让委托来调用,是不是方便了很多呢.
运行结果:
分享了这一小小的知识点,希望对博友们有帮助,也希望园子里的朋友能给一些建议,让我等能学到更多的东西,提升自己。