程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#從委托到Lambda表達式,我們應該知道的是——為什麼?

C#從委托到Lambda表達式,我們應該知道的是——為什麼?

編輯:C#入門知識

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

 

 

摘自 白光

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved