在上一篇博文發布之后,得到廣大博友們的關注,本人甚感欣慰,對於博友們對我的鼓勵和提出的一些建議,對我來說,都是很寶貴的,借用老外的一句話,“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方法傳參,又可以把方法的引用傳給委托,讓委托來調用,是不是方便了很多呢.
運行結果:

分享了這一小小的知識點,希望對博友們有幫助,也希望園子里的朋友能給一些建議,讓我等能學到更多的東西,提升自己。
