詳細(xì)介紹C#3.5新特性
一.C#3.5新特性-var關(guān)鍵字
關(guān)鍵字var,是否讓您想起了JavaScript中的定義變量的關(guān)鍵字var?事實(shí)上,這兩個(gè)看似相同的關(guān)鍵字卻有本質(zhì)上的區(qū)別。而這個(gè)var關(guān)鍵字并非在C#3.5中才出現(xiàn)的,它在C#3.0中便已經(jīng)存在,之所以在此介紹它,是因?yàn)橐榻B3.5,必須而且應(yīng)該去介紹一下這個(gè)在C#3.0中便出現(xiàn)的特性--本地類型推斷(Local Type Reference)。
在C#2.0及其以前的版本中,如若定義一可以向其賦任何值的變量,那么我們需對(duì)其以object關(guān)鍵字進(jìn)行定義,這種變量需要對(duì)值類型的進(jìn)行裝箱操作而且在對(duì)該變量使用的時(shí)候還需要進(jìn)行相應(yīng)的拆箱操作,而這種裝箱拆箱所耗費(fèi)的資源實(shí)在是筆者所不愿意看到的。
那么,我們既不愿意編寫(xiě)無(wú)謂耗費(fèi)資源的代碼,又想去實(shí)現(xiàn)object定義變量實(shí)現(xiàn)的功能,怎么辦?C#3.5為我們提供了一種變量定義方式:
- var intTest = 5;
- var customer = new Customer();
看上面的變量定義,其實(shí)這就是C#3.5為我們提供的一種新功能--本地類型推斷,它可以保護(hù)類型安全,而且允許您編寫(xiě)更為"自由"的代碼。也就是說(shuō),我們可以不去考慮變量的類型而直接以var關(guān)鍵字去修飾它,編譯器能夠從給變量賦值的表達(dá)式中智能推斷出變量的類型。它和COM模型中的Variant關(guān)鍵字定義出的變量完全不同,COM中的Variant關(guān)鍵字是變量晚綁定的一種方式,在編譯期沒(méi)有檢測(cè),僅在代碼運(yùn)行時(shí)才會(huì)出現(xiàn)它自身存在的問(wèn)題,而且一不小心就會(huì)出現(xiàn)一大堆令人討厭的Bug。而C#中這個(gè)var定義的變量在編譯期推斷出它的類型,并且編譯后的IL代碼中只包含推斷出的類型。
即上面的兩行代碼完全等同物如下代碼:
- var intTest = 5;
- Customer customer = new Customer();
事實(shí)上,var關(guān)鍵字不僅僅能夠?qū)崿F(xiàn)我們?nèi)缟纤龅墓δ?,它?huì)成為你在使用C#3.5進(jìn)行編程時(shí)非常熟悉的一個(gè)朋友,記住這個(gè)"匿名類型(Anonymous Type)",也記住這個(gè)"本地類型推斷(Local Type Reference)"。
二.C#3.5新特性-自動(dòng)屬性(Automatic Properties)
還記得我們?cè)贑#1.1和C#2.0寫(xiě)類的屬性時(shí)定義的那個(gè)小小的私有變量么?甚至有些人還因?yàn)樗接凶兞渴欠駪?yīng)該和屬性定義在一起而展開(kāi)了爭(zhēng)論。那么,現(xiàn)行社會(huì)流行的"減肥"這個(gè)詞也可以應(yīng)用到我們的程序代碼上來(lái)。
C#3.5為我們提供了自動(dòng)屬性(Automatic Properties),看如下代碼:
- var intTest = 5;
- var customer = new Customer();
get和set關(guān)鍵字均沒(méi)有我們以前所熟悉的return value;和_privateField=value;這樣的字眼。事實(shí)上,這就是善解人意的編譯器為我們提供的又一項(xiàng)新功能--自動(dòng)屬性。編譯器會(huì)為我們定義的Name屬性自動(dòng)生成一私有變量來(lái)保存其值。于是,我們?cè)瓉?lái)需要至少三行才能完成的代碼現(xiàn)在僅需一行便輕松完成了。
不過(guò),它有自身的局限性,比如說(shuō)不能在用自動(dòng)屬性定義的屬性中加邏輯判斷,get和set必須成對(duì)出現(xiàn)等。然而,筆者相信并非我們所有的屬性均要加上邏輯判斷吧?那么,就請(qǐng)去嘗試自動(dòng)屬性為我們帶來(lái)的便利
三.C#3.5新特性-lambda表達(dá)式
習(xí)慣C#編程的您在C#2.0及其以前見(jiàn)到過(guò)"=>" 這個(gè)符號(hào)么?這又是一新特性,我們可以將它讀作"lambda表達(dá)式"。
C# 2.0 通用使用匿名方法引入了"傳遞指針到特定代碼"作為參數(shù)的功能。這是一個(gè)功能強(qiáng)大的概念,但是這種方式您實(shí)際傳遞的是方法的一個(gè)指針,而不是代碼塊。那個(gè)引用指向編譯時(shí)生成的強(qiáng)類型代碼。使用泛型,您可獲得更大靈活性,但是對(duì)泛型類型難以應(yīng)用標(biāo)準(zhǔn)操作符 。C# 3.0 引入 lambda 表達(dá)式,它允許使用更簡(jiǎn)練的語(yǔ)法來(lái)定義匿名方法。
看如下代碼片斷:
- IEnumerble<Customer>HezeCstomers = customers
- wheren(c =>.Address == City.here
- Select(c =>C);l
且不說(shuō)其他部分意義,單來(lái)看我們.Where括號(hào)之中的部分,c=>c.Address==City.Heze這段代碼,我們可以將它理解為,給定 c,返回c.Address==City.Heze的記錄集,此處就是lambda表達(dá)式的應(yīng)用之一,我們將在以后的文章介紹,以上是介紹3個(gè)C#3.5新特性。
【編輯推薦】




















