在上一篇博文發布之後,得到廣大博友們的關注,本人甚感欣慰,對於博友們對我的鼓勵和提出的一些建議,對我來說,都是很寶貴的,借用老外的一句話,“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方法傳參,又可以把方法的引用傳給委托,讓委托來調用,是不是方便了很多呢.
運行結果:
分享了這一小小的知識點,希望對博友們有幫助,也希望園子裡的朋友能給一些建議,讓我等能學到更多的東西,提升自己。
摘自 白光