本篇內(nèi)容介紹了“C# 3.0的五項(xiàng)改進(jìn)是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供龍圩企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為龍圩眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
1.隱型局部變量
C# 3.0引入了一個(gè)叫做“var”的新關(guān)鍵字。這個(gè)關(guān)鍵字允許開(kāi)發(fā)者建立一個(gè)變量,但不必明確它的類(lèi)型。例如,用var說(shuō)明一個(gè)字符串,就像這樣:
varmyData = "This is my data"; |
注意,這里并沒(méi)有提到myData變量是一個(gè)字符串,而C# 2.0卻要求這一點(diǎn)。
雖然var允許您建立隱含的類(lèi)型,它并沒(méi)有降低C#濃厚的類(lèi)型特征。var關(guān)鍵字只有在建立變量時(shí)有用,一旦您建立變量并且確定它的類(lèi)型以后,就不能再用var來(lái)改變一個(gè)變量的類(lèi)型。
例如,這段代碼沒(méi)有作用:
varmyDate = DateTime.Now; myDate = "Hello."; |
使用var關(guān)鍵字還會(huì)產(chǎn)生一個(gè)有趣的結(jié)果,它可以幫助開(kāi)發(fā)者減少建立變量時(shí)的代碼輸入。例如,在C# 2.0中建立一個(gè)Customer對(duì)象,需要輸入以下代碼:
Customer myCustomer = new Customer(); |
使用新的var關(guān)鍵字,則只要輸入:
varmyCustomer = new Customer(); |
var關(guān)鍵字的另一個(gè)特點(diǎn)在于,使用它可以避免改變一個(gè)返回某個(gè)類(lèi)型對(duì)象的方法調(diào)用。例如,在C# 2.0中,如果您需要調(diào)用一個(gè)返回Customer對(duì)象的方法,您應(yīng)該編寫(xiě)以下代碼:
Customer myCustomer = GetByName("Zach"); |
如果某個(gè)時(shí)候GetByName方法返回一個(gè)不是Customer的對(duì)象,這段代碼就無(wú)法編譯。但是,如果應(yīng)用var關(guān)鍵字,您就不用擔(dān)心GetByName返回的對(duì)象類(lèi)型。
varmyData = GetByName("Zach"); |
現(xiàn)在,因?yàn)閼?yīng)用了var關(guān)鍵字,GetByName方法能夠進(jìn)行改變,返回一個(gè)Person對(duì)象,這個(gè)方法調(diào)用也依然有效。
2.extension方法
在C#中,您不能繼承和擴(kuò)充用訪問(wèn)標(biāo)識(shí)符標(biāo)記為“封裝”的類(lèi)型。但在C# 3.0中,extension方法允許您擴(kuò)充任何類(lèi),甚至是標(biāo)記為封裝的類(lèi)。例如,如果希望添加一個(gè)NoSpaces()方法到字符串類(lèi)中,我們要定義一個(gè)類(lèi)似列表A中的extension方法。
namespaceMyExtensionMethods { public static class Extension { public static void NoSpaces(this string data) { return data.Replace(" ", ""); } } } |
在一個(gè)類(lèi)中導(dǎo)入這個(gè)extension方法時(shí),開(kāi)發(fā)者就能夠?qū)@個(gè)類(lèi)包含的任何字符串調(diào)用NoSapces()方法。
extension方法的***個(gè)參數(shù)決定extension方法的有效類(lèi)型。在這種情況下,“這個(gè)字符串?dāng)?shù)據(jù)”(this string data)表明extension方法適用于字符串類(lèi);如果extension方法以“這個(gè)對(duì)象數(shù)據(jù)”(this object data)為***個(gè)參數(shù),則說(shuō)明這個(gè)方法對(duì)每個(gè)對(duì)象有效。
要表明您希望導(dǎo)入extension方法,只需在它們的命名空間中包括一個(gè)using指令。例如,要應(yīng)用上面說(shuō)明的方法,需要在類(lèi)文件中包括一個(gè)using MyExtensionMethods指令:
usingMyExtensionMethods; namespace MyNamespace { public class MyClass { public MyClass() { string data = "this is my data"; //nospaces will contain "thisismydata". string nospaces = data.NoSpaces(); } } } |
注意extension方法的優(yōu)先度比instance方法低。因此如果instance方法和extension方法有同樣的簽名,則應(yīng)執(zhí)行instance方法。
3.對(duì)象初始化器
在C# 2.0中,開(kāi)發(fā)者認(rèn)為建立許多構(gòu)造器來(lái)設(shè)定某個(gè)屬性值為對(duì)象初始化過(guò)程。下面是一個(gè)例子: 類(lèi)訪問(wèn)Customer方法:
Customer myCustomer = new Customer("Zach", "Smith"); |
Customer類(lèi)構(gòu)造器:
public Customer(string firstName, string lastName) : this() { this.FirstName = firstName; this.LastName = lastName; } public Customer() {} |
C# 3.0介紹了一個(gè)初始化對(duì)象的新方法,它允許您在初始化對(duì)象時(shí)設(shè)定任何屬性值。例如,在C# 3.0中,上面的代碼塊可以寫(xiě)成:
類(lèi)訪問(wèn)Customer方法:
Customer myCustomer = new Customer{FirstName = "Zach", LastName = "Smith" }; |
Customer類(lèi)構(gòu)造器:
public Customer() {} |
在C# 3.0代碼中,沒(méi)有與初始化對(duì)象對(duì)應(yīng)的構(gòu)造器。這樣,開(kāi)發(fā)者就不用為每組需要設(shè)定的屬性建立不同的構(gòu)造器。
這樣產(chǎn)生的另外一個(gè)效果是:代碼變得更容易閱讀了。例如,雖然我們清楚知道下面的代碼對(duì)一個(gè)Car對(duì)象進(jìn)行了初始化,但我們并不清楚其中變量的作用:
Car car = new Car(18, 10, 550); |
一眼看來(lái),下面這行代碼更易閱讀,盡管我們必須輸入更多代碼:
Car car = new Car { WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 }; |
4.匿名類(lèi)型
C# 2.0引入了匿名方法,C# 3.0推出匿名類(lèi)型。匿名類(lèi)型與匿名方法類(lèi)似,它們都是以嵌入方式建立,并沒(méi)有正式的名稱。在建立一個(gè)匿名類(lèi)型,您必須組合上述對(duì)象初始化器和隱型局部變量?jī)蓚€(gè)概念。下面是一個(gè)匿名類(lèi)型的例子:
varmyType = new { Length = 79, Width = 30 }; |
匿名類(lèi)型的范圍與任何其它變量的范圍相同。例如,下面代碼塊中的cobra實(shí)例僅僅在Speed函數(shù)塊中有效:
private void Speed() { var cobra = new { Horsepower = 550, Torque = 570 }; } |
如果一個(gè)匿名類(lèi)型被初始化而另一個(gè)匿名類(lèi)型位于范圍域中,并且它們的簽名相同,第二個(gè)類(lèi)型將自己占用***個(gè)類(lèi)型的類(lèi)型。例如,在下面這段代碼中,cobra和mustang都是匿名類(lèi)型,并且可以彼此設(shè)定。
private void Speed() { var cobra = new { Horsepower = 550, Torque = 570 }; var mustang = new { Horsepower = 300, Torque = 300 }; mustang = cobra; //or you could say cobra = mustang } |
5.LINQ
在之前的C#版中,開(kāi)發(fā)者應(yīng)用許多不同的查詢語(yǔ)言來(lái)訪問(wèn)不同的數(shù)據(jù)源。例如,要查詢一個(gè)XML文件,開(kāi)發(fā)者會(huì)使用XPath,要查詢一個(gè)SQL數(shù)據(jù)庫(kù),開(kāi)發(fā)者將使用SQL。在過(guò)去這種方法十分有效,并且現(xiàn)在仍然是訪問(wèn)各種數(shù)據(jù)的主要方法。但是,這種方法具有一些缺點(diǎn)。 一個(gè)顯著的缺點(diǎn)在于:開(kāi)發(fā)者必須以一種不同的語(yǔ)言,而非他們當(dāng)前使用的語(yǔ)言(如SQL或XPath)來(lái)編寫(xiě)查詢代碼。另一個(gè)缺點(diǎn)是,在執(zhí)行某些查詢語(yǔ)言,如SQL時(shí),開(kāi)發(fā)者必須編寫(xiě)映射代碼將查詢結(jié)果轉(zhuǎn)化為可用的C#業(yè)務(wù)對(duì)象。
C#3.0推出一種稱之為語(yǔ)言集成查詢(LINQ)的新方法。應(yīng)用LINQ,開(kāi)發(fā)者可以編寫(xiě)出能夠搜索任何IEnumerable<T>數(shù)據(jù)源的代碼。所以除了應(yīng)用TSQL訪問(wèn)MS SQL數(shù)據(jù)庫(kù),應(yīng)用XPath訪問(wèn)XML文件外,他們還可以應(yīng)用LINQ。
下面的代碼是一個(gè)LINQ查詢的例子,它返回所有OrderCount大于10的顧客:
using System; using System.Query; using System.Collections.Generic; public class SampleClass { static void Main() { Listcustomers = GetCustomers(); //Write our query to retrieve customers who have more than // 10 orders. IEnumerablequeryResult = from customer in customers where customer.OrderCount > 10 orderbycustomer.ID select customer; } } |
與SQL或XPath不同,LINQ查詢用C#,而非第三方語(yǔ)言編寫(xiě)。這樣,查詢就不會(huì)出現(xiàn)類(lèi)型問(wèn)題,開(kāi)發(fā)者也就沒(méi)有必要編寫(xiě)映射代碼把查詢返回的數(shù)據(jù)轉(zhuǎn)化成C#對(duì)象,而由LINQ API自動(dòng)處理映射。
“C# 3.0的五項(xiàng)改進(jìn)是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
文章標(biāo)題:C#3.0的五項(xiàng)改進(jìn)是什么
網(wǎng)站路徑:http://www.rwnh.cn/article34/psgcse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、微信公眾號(hào)、網(wǎng)站維護(hù)、企業(yè)網(wǎng)站制作、外貿(mào)建站、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)