自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#3.0中Lambda表達式詳解

開發(fā) 后端
C#3.0已經(jīng)推出好一段時間了,由于種種原因,一直沒有去學(xué)習(xí),這兩天在園子中看到老趙的拯救C# 2.0,但是我們真做的到嗎?。里面提到了些C#3.0的新特性和優(yōu)勢。勾起了我對3.0的興趣,初探學(xué)習(xí)一下,分享給新手。

在C#2.0中,微軟給我們帶來了一些新的特性,例如泛型,匿名委托等。然而,這些新的特性多多少少會給人一種從別的語言中“抄”來的感覺(例如泛型類似C++的模板,一些特性類似Java中的一些東西)。但是在C#3.0中,微軟給我?guī)淼囊恍┬绿匦钥赡苁且郧八虚_發(fā)語言都沒有的特性。這無疑大大的體現(xiàn)了C#3.0在開發(fā)語言中強大的優(yōu)勢。

Lambda表達式

Lambda 表達式是一個匿名函數(shù),它可以包含表達式和語句,并且可用于創(chuàng)建委托或表達式目錄樹類型。所有 Lambda 表達式都使用 Lambda 運算符 =>。關(guān)于Lambda更詳細的講解大家可以參看 MSDN。里面說的很清楚。

這里簡單舉個例子來說明Lambda的好處。Lambda在對匿名委托的處理上提供了更清楚的實施方式。例如在2.0中。我們可以寫這樣的代碼:

  1. Code  
  2. public class Example  
  3. {  
  4.    public static void Demo(System.Windows.Controls.TextBlock outputBlock)  
  5.    {  
  6.       Func convert = delegate(string s)  
  7.          { return s.ToUpper(); };  
  8.  
  9.       string name = "Dakota";  
  10.       outputBlock.Text += convert(name) + "\n";  
  11.    }  

在 C# 中將 Func<(Of <(T, TResult>)>) 委托與匿名方法一起使用。

在3.0中,我們可以使用Lambda來更清楚的進行參數(shù)的傳遞:

  1. Code  
  2. public class Example  
  3. {  
  4.    public static void Demo(System.Windows.Controls.TextBlock outputBlock)  
  5.    {  
  6.       Func convert = s => s.ToUpper();  
  7.  
  8.       string name = "Dakota";  
  9.       outputBlock.Text += convert(name) + "\n";  
  10.    }  

Lambda 表達式的基礎(chǔ)類型是泛型 Func 委托之一。這樣能以參數(shù)形式傳遞 lambda 表達式,而不用顯式將其分配給委托。尤其是,因為 System.Linq 命名空間中許多類型方法具有 Func<(Of <(T, TResult>)>) 參數(shù),因此可以給這些方法傳遞 lambda 表達式,而不用顯式實例化 Func<(Of <(T, TResult>)>) 委托。這樣可以使我們的代碼更加簡潔,邏輯上更易于理解。

對象的初始化

在C#中,對象的初始化也做了一些改進。一個新的功能就是提供了更方便的語法規(guī)則來聲明變量的值。

假如我們聲明一個Student對象:

  1. Code  
  2. public class Student  
  3. {  
  4.     private string _stuName;  
  5.     private string _stuAge;  
  6.     private int _stuClass;  
  7.  
  8.     public Student() { }  
  9.  
  10.     public string StuName  
  11.     {  
  12.         get { return _stuName; }  
  13.         set { _stuName = value; }  
  14.     }  
  15.  
  16.     public string StuAge  
  17.     {  
  18.         get { return _stuAge; }  
  19.         set { _stuAge = value; }  
  20.     }  
  21.  
  22.     public int StuClass  
  23.     {  
  24.         get { return _stuClass; }  
  25.         set { _stuClass = value; }  
  26.     }  
  27.  

在C#2.0中,我們是這樣聲明變量并賦值的:

  1. Student stu = new Student();  
  2.         stu.StuName = "Brian";  
  3.         stu.StuAge = "21";  
  4.         stu.StuClass = "1班"

而在C#3.0中,我們可以這樣初始化對象:

  1. Student stu2 = new Student   
  2.         {  
  3.             StuName = "Brian",  
  4.             StuAge = "21",  
  5.             StuClass = "1班" 
  6.         }; 

從代碼中不難看出,C#3.0給我們提供了很方便得方式來進行對象的初始化工作。

查詢

這個想必大家都應(yīng)該有所耳聞,那就是鼎鼎大名的Linq。這是C#3.0中最獨特好用的新特性之一。Linq改變了我們寫數(shù)據(jù)應(yīng)用程序的方式,先前,開發(fā)人員需要考慮并編寫不用的代碼來處理不同數(shù)據(jù)源中的數(shù)據(jù)(SQL Server ,XML ,Memory....)。LINQ很好的幫我們解決了這個煩人的問題。同時借助Lambda,我們可以更方便準(zhǔn)確的查詢我們想要的數(shù)據(jù)。

使用Linq簡單的數(shù)據(jù)查詢例子:

  1. Code  
  2. private void BindGridView(string criteria)  
  3.     {  
  4.         string strConn = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString;  
  5.         NorthwindDb db = new NorthwindDb(strConn);  
  6.  
  7.         IEnumerable results;  
  8.  
  9.         if (criteria == string.Empty)  
  10.         {  
  11.             results=db.Employee.ToArray();  
  12.         }  
  13.         else  
  14.         {  
  15.             results = (from c in db.Employee  
  16.                           where c.FirstName.Contains(criteria)  
  17.                           select c).ToArray();  
  18.               
  19.         }  
  20.         GridView1.DataSource = results;  
  21.         GridView1.DataBind();  
  22.     } 

變量聲明

這里要說的是var。var是C#3.0中提供的用于聲明變量的關(guān)鍵字,開發(fā)人員可以不考慮變量的類型就可以對變量進行聲明(這一點用法非常類似Javascript)。但是兩者還是有些差異。

相同點:用var來聲明任何類型的局部變量。

不同點:它僅僅負責(zé)告訴編譯器,該變量需要根據(jù)初始化表達式來推斷變量的類型,而且只能是局部變量。

我們可以這樣聲明變量:

  1. var i10;   
  2. var name = "edisundong";   
  3. var numbers = new int[] { 1, 2, 3 };  

var僅僅是個關(guān)鍵字,它并不是C#3.0中的一種新的類型,而是負責(zé)告訴編譯器,該變量需要根據(jù)初始化表達式來推斷變量的類型,上面的語句相當(dāng)于

  1. int i10;   
  2. string name = " edisundong ";   
  3. int[] numbers = new int[] { 1, 2, 3 };  


這里還需要注意幾點:

1.在聲明時必須同時賦值。

2.在使用var聲明一個局部變量后,他仍然具備強類型。

  1. var integer = 10;   
  2. integer = " edisundong ";  

編譯時會報Cannot implicitly convert type string to int錯誤。

3. 初始化器表達式的編譯期類型不能夠是空(null)類型。

4. var的聲明僅限于局部變量

擴展方法

以前如果我們想擴展一個類的功能必須直接源自于它并且從學(xué)其中的方法,在C#3.0中,介紹了一種很快捷的擴展功能的方法。

  1. Code  
  2. public static class StudentExtensionMethods  
  3.     {  
  4.         public StudentExtensionMethods()  
  5.         {  
  6.             //  
  7.             //TODO: 在此處添加構(gòu)造函數(shù)邏輯  
  8.             //  
  9.         }  
  10.         public static string GetStudentInformation(this Student stu)  
  11.         {  
  12.             return string.Format("Name: {0} {1} Age: {2}", stu.StuName,  
  13.             stu.StuAge, stu.StuClass);  
  14.         }  
  15.     } 

定義一個類,其中定義一個方法,注意:這個類和方法都是static的,并且方法的參數(shù)是類Student。這樣,Student類就可以擴展GetStudentInformation方法:

  1. Code  
  2. Student stu2 = new Student  
  3.             {  
  4.                 StuName = "Brian",  
  5.                 StuAge = "12",  
  6.                 StuClass = "1班" 
  7.             };  
  8.             Console.WriteLine(stu2.GetPersonInformation()); 

小結(jié):初學(xué)了下C#3.0,感覺帶來了不少驚喜,其中有很多新的特性是以前所未知的。C#3.0的新特性應(yīng)該還不止這些,還需繼續(xù)學(xué)習(xí)研究。

【編輯推薦】

  1. 淺談C#泛型的用處
  2. 淺談C#如何實現(xiàn)多繼承
  3. C#語言與Java語言程序的比較
  4. 利用C#指針進行圖像操作
  5. C#中用鼠標(biāo)移動頁面功能的實現(xiàn)
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2024-03-25 13:46:12

C#Lambda編程

2009-09-14 13:57:20

C# Lambda表達Lambda表達式

2010-09-14 14:05:42

C#委托

2009-07-09 09:51:07

Lambda表達式C#

2009-08-27 09:44:59

C# Lambda表達

2022-09-19 14:12:27

C++Lambda表達式

2009-08-26 16:17:23

C# Lambda表達

2009-08-27 09:57:50

C# Lambda表達

2024-03-12 08:23:54

JavaLambda函數(shù)式編程

2023-03-23 18:40:18

Lambda編程C++

2010-10-19 10:03:02

Lambda表達式

2021-08-31 07:19:41

Lambda表達式C#

2020-10-16 06:40:25

C++匿名函數(shù)

2023-11-02 08:25:58

C++Lambda

2009-09-11 09:48:27

Linq Lambda

2009-09-09 13:01:33

LINQ Lambda

2009-09-15 15:18:00

Linq Lambda

2022-12-05 09:31:51

接口lambda表達式

2009-08-07 15:41:39

C#正規(guī)表達式

2009-10-12 10:11:08

Lambda表達式編寫
點贊
收藏

51CTO技術(shù)棧公眾號