C#3.0中Lambda表達式詳解
在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更詳細(xì)的講解大家可以參看 MSDN。里面說的很清楚。
這里簡單舉個例子來說明Lambda的好處。Lambda在對匿名委托的處理上提供了更清楚的實施方式。例如在2.0中。我們可以寫這樣的代碼:
publicclassExample { publicstaticvoidDemo(System.Windows.Controls.TextBlockoutputBlock) { Funcconvert=delegate(strings) {returns.ToUpper();}; stringname="Dakota"; outputBlock.Text+=convert(name)+"n"; } }
在 C# 中將 Func<(Of <(T, TResult>)>) 委托與匿名方法一起使用。
在3.0中,我們可以使用Lambda來更清楚的進行參數(shù)的傳遞:
publicclassExample { publicstaticvoidDemo(System.Windows.Controls.TextBlockoutputBlock) { Funcconvert=s=>s.ToUpper(); stringname="Dakota"; outputBlock.Text+=convert(name)+"n"; } }
Lambda 表達式的基礎(chǔ)類型是泛型 Func 委托之一。這樣能以參數(shù)形式傳遞 lambda 表達式,而不用顯式將其分配給委托。尤其是,因為 System.Linq 命名空間中許多類型方法具有 Func<(Of <(T, TResult>)>) 參數(shù),因此可以給這些方法傳遞 lambda 表達式,而不用顯式實例化 Func<(Of <(T, TResult>)>) 委托。這樣可以使我們的代碼更加簡潔,邏輯上更易于理解。
對象的初始化
在C#中,對象的初始化也做了一些改進。一個新的功能就是提供了更方便的語法規(guī)則來聲明變量的值。
假如我們聲明一個Student對象:
publicclassStudent { privatestring_stuName; privatestring_stuAge; privateint_stuClass; publicStudent(){} publicstringStuName { get{return_stuName;} set{_stuName=value;} } publicstringStuAge { get{return_stuAge;} set{_stuAge=value;} } publicintStuClass { get{return_stuClass;} set{_stuClass=value;} } }
在C#2.0中,我們是這樣聲明變量并賦值的:
Studentstu=newStudent(); stu.StuName="Brian"; stu.StuAge="21"; stu.StuClass="1班";
而在C#3.0中,我們可以這樣初始化對象:
Studentstu2=newStudent { StuName="Brian", StuAge="21", StuClass="1班" };
從代碼中不難看出,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ù)查詢例子:
privatevoidBindGridView(stringcriteria) { stringstrConn=ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; NorthwindDbdb=newNorthwindDb(strConn); IEnumerableresults; if(criteria==string.Empty) { results=db.Employee.ToArray(); } else { results=(fromcindb.Employee wherec.FirstName.Contains(criteria) selectc).ToArray(); } GridView1.DataSource=results; GridView1.DataBind(); }
變量聲明
這里要說的是var。var是C#3.0中提供的用于聲明變量的關(guān)鍵字,開發(fā)人員可以不考慮變量的類型就可以對變量進行聲明(這一點用法非常類似Javascript)。但是兩者還是有些差異。
相同點:用var來聲明任何類型的局部變量。
不同點:它僅僅負(fù)責(zé)告訴編譯器,該變量需要根據(jù)初始化表達式來推斷變量的類型,而且只能是局部變量。
我們可以這樣聲明變量:
vari=10; varname="edisundong"; varnumbers=newint[]{1,2,3};
var僅僅是個關(guān)鍵字,它并不是C#3.0中的一種新的類型,而是負(fù)責(zé)告訴編譯器,該變量需要根據(jù)初始化表達式來推斷變量的類型,上面的語句相當(dāng)于
inti=10; stringname="edisundong"; int[]numbers=newint[]{1,2,3};
這里還需要注意幾點:
1.在聲明時必須同時賦值。
2.在使用var聲明一個局部變量后,他仍然具備強類型。
varinteger=10;
integer="edisundong";
編譯時會報Cannot implicitly convert type string to int錯誤。
3. 初始化器表達式的編譯期類型不能夠是空(null)類型。
4. var的聲明僅限于局部變量
擴展方法
以前如果我們想擴展一個類的功能必須直接源自于它并且從學(xué)其中的方法,在C#3.0中,介紹了一種很快捷的擴展功能的方法。
publicstaticclassStudentExtensionMethods { publicStudentExtensionMethods() { // //TODO:在此處添加構(gòu)造函數(shù)邏輯 // } publicstaticstringGetStudentInformation(thisStudentstu) { returnstring.Format("Name:{0}{1}Age:{2}",stu.StuName, stu.StuAge,stu.StuClass); } }
定義一個類,其中定義一個方法,注意:這個類和方法都是static的,并且方法的參數(shù)是類Student。這樣,Student類就可以擴展GetStudentInformation方法:
Studentstu2=newStudent { StuName="Brian", StuAge="12", StuClass="1班" }; Console.WriteLine(stu2.GetPersonInformation());
小結(jié):初學(xué)了下C#3.0,感覺帶來了不少驚喜,其中有很多新的特性是以前所未知的。C#3.0的新特性應(yīng)該還不止這些,還需繼續(xù)學(xué)習(xí)研究。
相關(guān)文章
C#實現(xiàn)過濾html標(biāo)簽并保留a標(biāo)簽的方法
這篇文章主要介紹了C#實現(xiàn)過濾html標(biāo)簽并保留a標(biāo)簽的方法,文中的自定義函數(shù)采用正則過濾實現(xiàn)了該功能,是非常實用的技巧,需要的朋友可以參考下2014-09-09Unity ScrollRect實現(xiàn)軌跡滑動效果
這篇文章主要為大家詳細(xì)介紹了Unity ScrollRect實現(xiàn)軌跡滑動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09C#實現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法
這篇文章主要介紹了C#實現(xiàn)根據(jù)指定容器和控件名字獲得控件的方法,其中包括了遍歷與遞歸的應(yīng)用,需要的朋友可以參考下2014-08-08