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

來源:互聯網
上載者:User

在 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)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.