首頁  >  文章  >  後端開發  >  C#學習日記25---匿名方法 與 Func委託 與 lambda表達式

C#學習日記25---匿名方法 與 Func委託 與 lambda表達式

黄舟
黄舟原創
2017-01-21 15:31:491785瀏覽

   在 2.0 之前的 C# 版本中,聲明委託的唯一方法是使用命名方法。 C# 2.0 引入了匿名方法(委託),而在 C# 3.0 及更高版本中,Lambda 表達式取代了匿名方法,作為編寫內聯程式碼的首選方式。

匿名委託(方法):

       匿名委託的叫法並不準確,準確的應該叫做匿名方法,(總之兩者是一個意思啦)。前面  委託類型  中我已經提到過,委託是用來引用與其具有相同標籤的方法。換句話說,您可以使用委託物件呼叫可由委託引用的方法(參數是方法名稱)。而匿名方法則是將程式碼區塊作為委託參數(參數是實現功能的程式碼)透過使用匿名方法,由於您不必建立單獨的方法,因此減少了實例化委託所需的編碼系統開銷。

 

編輯匿名方法:

  匿名方法是直接掛載在委託內的程式碼區塊,還是得透過使用 delegate 關鍵字建立委託實例來宣告。

    delegate void MyDelegate(int i); //聲明一個委託

          實作一個匿名方法

 

匿名方法實例:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    { //声明一个委托  
        delegate void MyDelegate(string str);   
        //定义一个实名方法  
        public static void fun(string str)    
        {  
            Console.WriteLine("这是一个 {0} 方法", str);  
        }  
        static void Main(string[] args)  
        {  
            //创建一个委托实例,里面包含一个匿名方法  
            MyDelegate examp1 = delegate(string name)   
            {  
              Console.WriteLine("这是一个 {0} 方法",name); //代码块  
            };  
            examp1("匿名");  //调用匿名方法  
  
            MyDelegate examp2 = new MyDelegate(fun); //在委托中实名注册一个fun命名方法  
            examp2("实名");  //调用命名方法  
        }  
    }  
}

結果:

C#學習日記25---匿名方法 與 Func委託 與 lambda表達式

匿名方法的參數的範圍是「匿名方法區塊」。

如果目標在區塊外部,那麼,在匿名方法區塊內使用跳躍語句(如 goto、break 或 continue)是錯誤的。如果目標在區塊內部,在匿名方法區塊外部使用跳躍語句(如goto、break 或continue)也是錯誤的。

 

Func委託:

         先前我們使用delegate委託時必須的提前聲明一個delegate類,然後向委託中註冊方法,例如:

rr delegate類,但又需要使用委託時,我們該怎麼辦呢? 此時我們可以考慮使用Func委託。 Func在中最後的參數為回傳值類型,前面的都是傳入方法參數類型,作用與委託類似,但不需要聲明,上面的例子改為Func委託:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        delegate string MyDelegate(string s);//声明委托  
        public static string Toup(string str) //定义方法  
        {  
            return str.ToUpper();  
        }  
        static void Main(string[] args)  
        {  
            string str = "abc";  
              
            MyDelegate my = Toup; //注册方法  
            Console.WriteLine(my(str));//调用方法 结果 ABC  
              
        }  
    }  
}

 對比下,兩者結果一樣,但Func卻比Delegate簡潔了很多,但是Delegate能夠加載匿名方法,比如上面的例子我們使用匿名方法:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        public static string Toup(string str) //定义方法  
        {  
            return str.ToUpper();  
        }  
        static void Main(string[] args)  
        {  
            string str = "abc";  
  
            Func<string, string> change = Toup; //泛型委托  
            Console.WriteLine(change(str));//调用方法 结果 ABC  
              
        }  
    }  
}

  Func也行嗎? Func也是可以創建匿名方法的,同樣的也不需要聲明,如下:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        delegate string MyDelegate(string s);//声明委托  
  
        static void Main(string[] args)  
        {  
            string str = "abc";  
            //创建匿名方法  
            MyDelegate my = delegate(string s) { return s.ToUpper(); };   
            Console.WriteLine(my(str)); //结果 ABC  
              
        }  
    }  
}

 與上面的匿名方法對比我們發現,在創建匿名方法的時候兩者都是透過delegate 來實現的(還是用到了delegate) ,可不可以不用delegate ,不用它是可以的,這時我們需要學習lambda 表達式

 

lambda表達式:

    Lambda 表達式是一種可用於創建委託或表達式目錄樹的匿名方法。 透過使用 lambda 表達式,可以寫入可作為參數傳遞或作為函數呼叫值傳回的本地函數。若要建立 Lambda 表達式,需要在 Lambda 運算子 => 左側指定輸入參數(如果有),然後在另一側輸入表達式或語句區塊。 例如,lambda 表達式 x => x * x 指定名為 x 的參數並傳回 x 的平方值。


   所以上面的例子我們使用lambda 表達式創建匿名方法改為:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            string str = "abc";  
            //创建匿名方法  
            Func<string, string> change = delegate(string s) { return s.ToUpper(); };  
            Console.WriteLine(change(str)); //结果 ABC  
              
        }  
    }  
}

   在delegate委託類型中,我們也可以使用lambdar-Rhed

:日記--匿名方法與Func委託與lambda表達式的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn