在 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("实名"); //调用命名方法 } } }
結果:
匿名方法的參數的範圍是「匿名方法區塊」。
如果目標在區塊外部,那麼,在匿名方法區塊內使用跳躍語句(如 goto、break 或 continue)是錯誤的。如果目標在區塊內部,在匿名方法區塊外部使用跳躍語句(如goto、break 或continue)也是錯誤的。
Func
先前我們使用delegate委託時必須的提前聲明一個delegate類,然後向委託中註冊方法,例如:
rr delegate類,但又需要使用委託時,我們該怎麼辦呢? 此時我們可以考慮使用Func委託。 Funcusing 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 的平方值。
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)!