第3章C# 4.0新增功能_第1頁(yè)
第3章C# 4.0新增功能_第2頁(yè)
第3章C# 4.0新增功能_第3頁(yè)
第3章C# 4.0新增功能_第4頁(yè)
第3章C# 4.0新增功能_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

此PPT有視頻學(xué)習(xí),如果有需要,請(qǐng)聯(lián)系QQ人民幣/個(gè)視頻,共19個(gè)視頻,全部買只需10元。謝謝!,第3章C#4.0語言特色,C#4.0在語法上與以前的C#版本(2.0版本及以上)完全兼容,因此開發(fā)人員可以直接在VisualStudio2010中編寫C#2.0的應(yīng)用程序,但是C#4.0通過增加很多新的功能簡(jiǎn)化了C#2.0語法的復(fù)雜性,比如隱式類型聲明、擴(kuò)展方法、對(duì)象初始化器等等,本章的內(nèi)容將詳細(xì)介紹這些語法上的增強(qiáng),讓讀者在以后開發(fā)ASP.NET應(yīng)用程序時(shí),具有堅(jiān)實(shí)的基礎(chǔ)。本章內(nèi)容有:隱式聲明自動(dòng)屬性對(duì)象初始化器擴(kuò)展方法和匿名類型局部方法Lambda表達(dá)式LINQ查詢,3.1局部變量的隱式聲明,在C#4.0中,可以使用隱式類型的局部變量,而不用顯示的指定變量的類型。編譯器將根據(jù)變量的值來進(jìn)行類型的推斷,并在最終的編譯結(jié)果中指定正確的類型。隱式類型在C#4.0中非常有用,比如LINQ技術(shù)就大量使用了隱式聲明。,3.1.1如何聲明隱式局部變量,C#4.0中新增了一個(gè)關(guān)鍵字var(從C#3.0開始就出現(xiàn)該關(guān)鍵字),只需要在指定類型的位置使用var關(guān)鍵字,就可以完成隱式類型的聲明。,3.1.2在foreach循環(huán)中使用隱式聲明,還可以在foreach循環(huán)中使用隱式類型的聲明,下面新建一個(gè)控制臺(tái)應(yīng)用程序來演示如何在foreach循環(huán)中使用隱式聲明。新建一個(gè)控制臺(tái)應(yīng)用程序,命名為ImplicitlyforeachVar,在Main方法中添加如下的代碼。,3.1.3隱式類型變量的限制,由于編譯器要進(jìn)行類型的推斷,在聲明和使用隱式類型的變量時(shí),具有一定的限制。,3.1.4隱式類型的局部數(shù)組,隱式類型的數(shù)組與隱式類型變量相似,數(shù)組的元素是從數(shù)組的初始值中推斷出來的。在3.1.2中,讀者己經(jīng)見過隱式類型數(shù)組的聲明,在本小節(jié)創(chuàng)建一個(gè)控制臺(tái)類型的項(xiàng)目,名稱為implicitlyArrays來演示隱式類型數(shù)組的聲明和使用。,3.1.5隱式類型變量的作用,對(duì)于一些無法確定類型的類型,使用隱式類型的變量是非常有用的。本書后面的討論LINQ的章節(jié)中,讀者將可以看到很多使用隱式類型變量的例子。,3.2自動(dòng)屬性,C#4.0的自動(dòng)屬性特性非常有用,當(dāng)需要一些簡(jiǎn)單的、沒有業(yè)務(wù)邏輯編碼的屬性代碼時(shí),使用自動(dòng)屬性特性能夠幫助開發(fā)人員節(jié)省很多重復(fù)工作的時(shí)間。,3.2.1理解自動(dòng)屬性,在C#2.0中,當(dāng)一個(gè)類中需要添加屬性時(shí),必須要為屬性創(chuàng)建一個(gè)私有域來存放數(shù)據(jù),然后添加讀取和寫入訪問器。,3.2.2訪問自動(dòng)屬性,訪問自動(dòng)屬性與訪問常規(guī)屬性一樣,可以讀取和賦值。,3.2.3自動(dòng)屬性的訪問限制,自動(dòng)屬性不能像標(biāo)準(zhǔn)屬性一樣能過省略訪問器來創(chuàng)建只讀或只寫的屬性。在聲明自動(dòng)屬性明,必須同時(shí)添加get和set訪問器,否則編譯器會(huì)報(bào)錯(cuò)。,3.2.4自動(dòng)屬性和默認(rèn)值,由于自動(dòng)屬性由編譯器來生成一個(gè)私有變量域來存儲(chǔ)數(shù)據(jù),因此開發(fā)人員不能直接為屬性指定默認(rèn)值,不過編譯器為自動(dòng)屬性自動(dòng)賦了較安全的默認(rèn)值,比如為int類型的屬性自動(dòng)賦為0,為bool類型的屬性自動(dòng)賦了false,為引用類型的屬性自動(dòng)賦值為null。,3.3對(duì)象初始化器,使用對(duì)象初始化器,可以在創(chuàng)建對(duì)象時(shí)直接向?qū)ο筚x值,無需顯示的調(diào)用對(duì)象的構(gòu)造函數(shù)。利用這個(gè)技術(shù),可以創(chuàng)建匿名類型,在3.5節(jié)將要進(jìn)行詳細(xì)討論??梢燥@著的減少編寫對(duì)象初始化語句的代碼。,3.3.1理解對(duì)象初始化器語法,這一小節(jié)將新建一個(gè)控制臺(tái)應(yīng)用程序來演示對(duì)象初始化器的語法,在VS2010中新建一個(gè)控制臺(tái)應(yīng)用程序,命名為ObjectInitializer。,3.3.2調(diào)用使用初始化語法的自定義構(gòu)造函數(shù),默認(rèn)情況下,對(duì)象初始化器調(diào)用默認(rèn)的無參數(shù)的構(gòu)造函數(shù),但是也可以根據(jù)需要調(diào)用自定義構(gòu)造函數(shù),事實(shí)上使用對(duì)象初始化語法,可以調(diào)用任何構(gòu)造函數(shù)。,3.3.3內(nèi)部類型的初始化,也可以使用對(duì)象初始化語法來直接初始化類內(nèi)部的類型。,3.3.4理解集合初始化語法,集合是一種在類的內(nèi)部包含多種其他類型的容器,其初始化語法與內(nèi)部類型的初始化語法類似。,3.4擴(kuò)展方法,假如想給任何己經(jīng)編譯好的類添加新的功能,例如給.NET中的基類Object增加一個(gè)SayHello的方法,在以前,開發(fā)人員只能從Object中派生一個(gè)基類,如果擁有要擴(kuò)充的類的源代碼,可以更改源代碼實(shí)現(xiàn)類似的功能。擴(kuò)展方法的出現(xiàn)解決了必須得更改源代碼或者是從Object中派生的問題,開發(fā)人員可以在一個(gè)單獨(dú)的類中對(duì)己存在的類進(jìn)行擴(kuò)展,為其添加附加的方法,并不需要對(duì)源始代碼進(jìn)行改動(dòng),也不需要從己存類中進(jìn)行繼承,這些附加的方法稱為擴(kuò)展方法。,3.4.1定義擴(kuò)展方法,要定義擴(kuò)展方法,需要注要三件事情:擴(kuò)展方法必須被定義在一個(gè)靜態(tài)類中,擴(kuò)展方法自身必須是一個(gè)靜態(tài)方法。擴(kuò)展方法中的首個(gè)參數(shù)必須是this,最后緊跟要擴(kuò)展的類的名稱。擴(kuò)展方法可以被正確的對(duì)象實(shí)例調(diào)用,也可以使用靜態(tài)類名靜態(tài)的調(diào)用。,3.4.2調(diào)用擴(kuò)展方法,擴(kuò)展方法一經(jīng)被定義,可以使用兩種方法來進(jìn)行調(diào)用,一種就是實(shí)例方法,就像在3.4.1小節(jié)中調(diào)用的那樣。還可以直接使用靜態(tài)類調(diào)用靜態(tài)方法。,3.4.3擴(kuò)展方法的使用范圍,擴(kuò)展方法由于是靜態(tài)方法,具有使用上的幾個(gè)要點(diǎn)需要注意:(1)擴(kuò)展方法的名稱不能與要擴(kuò)展的現(xiàn)在類相同,否則擴(kuò)展方法將不能被調(diào)用到。(2)其次是不能在擴(kuò)展方法中直接訪問擴(kuò)展方法擴(kuò)展的類的成員變量,由于擴(kuò)展方法是靜態(tài)方法,并不屬于類成員中的標(biāo)準(zhǔn)方法,因此不能直接進(jìn)行訪問。(3)如果擴(kuò)展方法與被擴(kuò)展的類具有不同的命名空間,需要在調(diào)用擴(kuò)展方法時(shí)引用定義擴(kuò)展方法的命名空間。,3.4.4使用擴(kuò)展方法擴(kuò)展接口類型,還可以使用擴(kuò)展方法來擴(kuò)展接口的功能,下面舉一個(gè)示例來演示這個(gè)功能的實(shí)現(xiàn)。創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名為ExtensionInterfaceMethod。,3.5匿名類型,匿名類型,如其名字所示,是指不具有名稱的類型。在一些情況下,開發(fā)人員只需要臨時(shí)的使用一個(gè)類型表達(dá)一些信息,這個(gè)類只需要保存一些只讀的信息,如狀態(tài)信息等,并不需要關(guān)聯(lián)任何方法,事件等,這時(shí)候可以不用顯示的去定義一個(gè)類,可以考慮使用匿名類型。,3.5.1理解匿名類型,匿名類型的創(chuàng)建非常簡(jiǎn)單,其實(shí)就是本章前面所討論的兩種技術(shù)的組合,一種是隱式聲明,一種是對(duì)象初始化器。,3.5.2匿名類型的內(nèi)部呈現(xiàn),匿名類型續(xù)承自System.object基類,該類是.NETFramework類庫(kù)中所有其他類的基類,因此可以直接訪問object中的幾個(gè)方法如GetType、ToString和GetHashCode來獲取匿名類型的內(nèi)部信息。,3.5.3匿名類型的相等語法,本小節(jié)來討論匿名類型的相等比較,假定有兩個(gè)匿名類型,可以通過調(diào)用重載的Equals方法來進(jìn)行相等值的比較。,3.6局部方法,當(dāng)C#2.0發(fā)布時(shí),筆者對(duì)其中的局部類實(shí)在是記憶深刻,局部類使開發(fā)人員將一個(gè)類的實(shí)現(xiàn)定義到多個(gè)代碼文件中,只需要使用關(guān)鍵字Partial,在多個(gè)文件中使用相同的類名。編譯時(shí),編譯器將生成一個(gè)完整的類,局部類的使用也非常廣泛,比如在類型化數(shù)據(jù)集中,就需要大量使用局部類來完成自定義的功能。在C#4.0中,微軟又再次推出了一個(gè)局部方法技術(shù),使開發(fā)人員可以在一個(gè)類文件中定義方法的聲明,而在另外一個(gè)類文件中定義方法的實(shí)現(xiàn)。,3.6.1理解局部方法,局部方法技術(shù)與局部類技術(shù)在團(tuán)隊(duì)開發(fā)中非常有用,可以讓一個(gè)開發(fā)人員定義方法的簽名,而讓另外一個(gè)開發(fā)人員定義方法的實(shí)現(xiàn),不過局部方法本身具有幾個(gè)局限性:局部方法僅用于局部類中。局部方法的返回值必須是void。局部方法可以是靜態(tài)的或者是實(shí)例化的。局部方法可以有參數(shù),可以包含參數(shù)修飾符如this、ref或Params,但是不包括out修飾符。局部方法隱式的訪問級(jí)別為private,因此不能為虛方法。,3.6.2使用局部方法,在Main方法中,實(shí)例化一個(gè)Book類,并調(diào)用BuyBook方法來購(gòu)買書籍,由于BuyBook會(huì)調(diào)用局部方法BookInStock來檢查庫(kù)存,并根據(jù)庫(kù)存結(jié)果來顯示結(jié)果到控制臺(tái)窗口中。,3.7Lambda表達(dá)式,在C#2.0中,引入了一個(gè)匿名方法的特性,使開發(fā)人員可以直接為委托添加方法語句塊,而不需要顯示的創(chuàng)建一個(gè)單獨(dú)的方法。在C#4.0中,提供了一個(gè)更加簡(jiǎn)法的方法來處理.NET中的委托類型,也即Lambda表達(dá)式。,3.7.1理解Lambda表達(dá)式,為了更好的講述Lambda表達(dá)式以便于理解,在這節(jié)同樣的先創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名為L(zhǎng)ambdaDemo。在本示例中,首先舉一個(gè)匿名方法的例子,然后來看看Lambda表達(dá)式是如何聲明并簡(jiǎn)化匿名方法的代碼的。,3.7.2剖析Lambda表達(dá)式,通過完成上一個(gè)例子,相信讀者對(duì)Lambda表達(dá)式有了一個(gè)基本的了解,一個(gè)Lambda的組成通常如下:首先是一個(gè)參數(shù)或參數(shù)列表,也就是輸入變量,在上一個(gè)示例中由于需要為委托傳遞一個(gè)字符串類型的變量,因此左側(cè)的是str變量。接下來是=符號(hào),稱作Lambda運(yùn)算符,MSDN中將這個(gè)符號(hào)念作“goesto”。最后是Lambda語句塊,可以是單條語句也可以是多個(gè)語句的語句塊。,3.7.3在Lambda中使用多語句塊,在上一個(gè)示例的Lambda表達(dá)式中,只處理了一行語句,也可以為L(zhǎng)ambda表達(dá)式添加多行語句。,3.7.4多參數(shù)的Lambda表達(dá)式,Lambda表達(dá)式中的參數(shù)部分同樣也非常靈活,即可以添加多個(gè)參數(shù),也可以不添加任何參數(shù)。,3.8LINQ簡(jiǎn)介,LINQ又稱為語言集成查詢,在本章中,筆者只打算簡(jiǎn)要的討論了一下什么是LINQ查詢,在本書第17章,將使用一整章的編幅來詳細(xì)的介紹LINQ技術(shù)。語言集成查詢讓開發(fā)人員可以使用.NET程序語言如C#,去查詢數(shù)據(jù)源,比如內(nèi)存中的集合對(duì)象、數(shù)據(jù)庫(kù)中的表、XML、DataSet等等,開發(fā)人員不用去分門別類的學(xué)習(xí)眾多的查詢語法就可以輕構(gòu)的查詢異構(gòu)數(shù)據(jù)源。,3.8.1什么是LINQ,LINQ的目標(biāo)是讓開發(fā)人員使用熟悉的語言如C#、VB.NET訪問數(shù)據(jù)庫(kù),而不用去管底層數(shù)據(jù)庫(kù)的細(xì)節(jié)。比如底層到底是ORACLE或者是SQLServer,這些都不用在乎。LINQ提供了豐富的指令來實(shí)現(xiàn)復(fù)雜的查詢,比如數(shù)據(jù)聚合,聯(lián)合查詢,排序等等。LINQ除了能查詢數(shù)據(jù)之外,還可以執(zhí)行添加、修改、刪除等操作。,3.8.2LINQ示例,下面使用VS2010開發(fā)一個(gè)簡(jiǎn)單的LINQtoSQL應(yīng)用程序,步驟如下所示。,3.9小結(jié),本章討論了在C#4.0語言的許多增強(qiáng)的功能,首先介紹了隱式類型聲明,由編譯器根據(jù)上下文進(jìn)行類型推斷,接下來討論了使用自動(dòng)屬性功能簡(jiǎn)化編寫重復(fù)性的屬性代碼。對(duì)象初始化器可以簡(jiǎn)化開發(fā)人員的賦值代碼,接下來討論了如何對(duì)一個(gè)現(xiàn)有類進(jìn)行擴(kuò)展的擴(kuò)展方法。匿名類型是一種隱式類型,通過使用隱式類型聲明和對(duì)象初始化器,編譯器將自動(dòng)生成隱式的類型。局部方法簡(jiǎn)化了團(tuán)隊(duì)開發(fā)的復(fù)雜性,Lambda表達(dá)式大大優(yōu)化匿名方法的代碼,最后簡(jiǎn)單的討論了LINQ技術(shù)。,3.10常見面試題,3.10.1你用過自動(dòng)屬性嘛?如何使用?常設(shè)計(jì)類的開發(fā)人員一定會(huì)先記住自動(dòng)屬性這個(gè)特色,因?yàn)樗梢怨?jié)省設(shè)計(jì)類的時(shí)間,并且使代碼更直

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論