在 2.0 之前的 C# 版本中,聲明委託的唯一方法是使用命名方法。C# 2.0 引入了匿名方法(委託),而在 C# 3.0 及更高版本中,Lambda 運算式取代了匿名方法,作為編寫內聯代碼的首選方式。
匿名委託(方法):
匿名委託的叫法並不準確,準確的應該叫做匿名方法,(總之兩者是一個意思啦)。前面 委託類型 中我已經提到過,委託是用於引用與其具有相同標籤的方法。換句話說,您可以使用委派物件調用可由委託引用的方法(參數是方法名)。而匿名方法則是將代碼塊作為委託參數(參數是實現功能的代碼)通過使用匿名方法,由於您不必建立單獨的方法,因此減少了執行個體化委託所需的編碼系統開銷。
編輯匿名方法:
匿名方法是直接掛載在委託內的代碼塊,還是得通過使用 delegate 關鍵字建立委託執行個體來聲明。
delegate void MyDelegate(int i); //聲明一個委託
MyDelegate my = delegate(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<T,Tresult>委託:
以前我們使用delegate委託時必須的提前聲明一個delegate類,然後向委託中註冊方法,比如:
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 } } }
如果當條件不允許我們在程式中聲明delegate類,但又需要使用委託時,我們該怎麼辦呢? 此時我們可以考慮使用Func委託。Func<string,string>在<>中最後的參數為傳回值類型,前面的都是傳入方法參數類型,作用與委託類似,但不需要聲明,上面的例子改為Func委託:
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卻比Delegate簡潔了很多,但是Delegate能夠載入匿名方法,比如上面的例子我們使用匿名方法:
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 } } }
Func也行嗎? Func也是可以建立匿名方法的,同樣的也不需要聲明,如下:
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 來實現的(還是用到了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"; //lambda 運算式 Func<string, string> change = s => s.ToUpper(); //傳入string 類型s 返回s.ToUpper(); Console.WriteLine(change(str)); //結果 ABC } } }
在delegate委託類型中,我們也可以使用lambda運算式建立匿名方法:
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"; //lambda 運算式 MyDelegate my = s => s.ToUpper(); //傳入string 類型s 返回s.ToUpper(); Console.WriteLine(my(str)); //結果 ABC } } }
以上就是 C#學習日記25---匿名方法 與 Func委託 與 lambda運算式的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!