1.隱型局部變數
C# 3.0引入了一個叫做“var”的新關鍵字。這個關鍵字允許開發人員建立一個變數,但不必明確它的類型。例如,用var說明一個字串,就像這樣:
| varmyData = "This is my data"; |
注意,這裡並沒有提到myData變數是一個字串,而C# 2.0卻要求這一點。
雖然var允許您建立隱含的類型,它並沒有降低C#濃厚的類型特徵。var關鍵字只有在建立變數時有用,一旦您建立變數並且確定它的類型以後,就不能再用var來改變一個變數的類型。
例如,這段代碼沒有作用:
varmyDate = DateTime.Now; myDate = "Hello."; |
使用var關鍵字還會產生一個有趣的結果,它可以協助開發人員減少建立變數時的代碼輸入。例如,在C# 2.0中建立一個Customer對象,需要輸入以下代碼:
| Customer myCustomer = new Customer(); |
使用新的var關鍵字,則只要輸入:
varmyCustomer = new Customer();
var關鍵字的另一個特點在於,使用它可以避免改變一個返回某個類型對象的方法調用。例如,在C# 2.0中,如果您需要調用一個返回Customer對象的方法,您應該編寫以下代碼:
| Customer myCustomer = GetByName("Zach"); |
如果某個時候GetByName方法返回一個不是Customer的對象,這段代碼就無法編譯。但是,如果應用var關鍵字,您就不用擔心GetByName返回的物件類型。
| varmyData = GetByName("Zach"); |
現在,因為應用了var關鍵字,GetByName方法能夠進行改變,返回一個Person對象,這個方法調用也依然有效。
2.extension方法
在C#中,您不能繼承和擴充用訪問標識符標記為“封裝”的類型。但在C# 3.0中,extension方法允許您擴充任何類,甚至是標記為封裝的類。例如,如果希望添加一個NoSpaces()方法到字串類中,我們要定義一個類似列表A中的extension方法。
列表A
namespaceMyExtensionMethods { public static class Extension { public static void NoSpaces(this string data) { return data.Replace(" ", ""); } } } |
在一個類中匯入這個extension方法時,開發人員就能夠對這個類包含的任何字串調用NoSapces()方法。
extension方法的第一個參數決定extension方法的有效類型。在這種情況下,“這個字串資料”(this string data)表明extension方法適用於字串類;如果extension方法以“這個對象資料”(this object data)為第一個參數,則說明這個方法對每個對象有效。
要表明您希望匯入extension方法,只需在它們的命名空間中包括一個using指令。例如,要應用上面說明的方法,需要在類檔案中包括一個using MyExtensionMethods指令:(列表B)
列表B
usingMyExtensionMethods; namespace MyNamespace { public class MyClass { public MyClass() { string data = "this is my data"; //nospaces will contain "thisismydata". string nospaces = data.NoSpaces(); } } } |
注意extension方法的優先度比instance方法低。因此如果instance方法和extension方法有同樣的簽名,則應執行instance方法。
3.對象初始化器
在C# 2.0中,開發人員認為建立許多構造器來設定某個屬性值為對象初始化過程。下面是一個例子: 類訪問Customer方法:
| Customer myCustomer = new Customer("Zach", "Smith"); |
Customer類構造器:
public Customer(string firstName, string lastName) : this() { this.FirstName = firstName; this.LastName = lastName; }public Customer() {} |
C# 3.0介紹了一個初始化對象的新方法,它允許您在初始化對象時設定任何屬性值。例如,在C# 3.0中,上面的代碼塊可以寫成:
類訪問Customer方法:
| Customer myCustomer = new Customer{FirstName = "Zach", LastName = "Smith" }; |
Customer類構造器:
在C# 3.0代碼中,沒有與初始化對象對應的構造器。這樣,開發人員就不用為每組需要設定的屬性建立不同的構造器。
這樣產生的另外一個效果是:代碼變得更容易閱讀了。例如,雖然我們清楚知道下面的代碼對一個Car對象進行了初始化,但我們並不清楚其中變數的作用:
| Car car = new Car(18, 10, 550); |
一眼看來,下面這行代碼更易閱讀,儘管我們必須輸入更多代碼:
| Car car = new Car { WheelDiameter = 18, WheelWidth = 10, Horsepower = 550 }; |
4.匿名型別
C# 2.0引入了匿名方法,C# 3.0推出匿名型別。匿名型別與匿名方法類似,它們都是以嵌入方式建立,並沒有正式的名稱。在建立一個匿名型別,您必須組合上述對象初始化器和隱型局部變數兩個概念。下面是一個匿名型別的例子:
| varmyType = new { Length = 79, Width = 30 }; |
匿名型別的範圍與任何其它變數的範圍相同。例如,下面代碼塊中的cobra執行個體僅僅在Speed函數塊中有效:
private void Speed() { var cobra = new { Horsepower = 550, Torque = 570 }; } |
如果一個匿名型別被初始化而另一個匿名型別位於範圍域中,並且它們的簽名相同,第二個類型將自己佔用第一個類型的類型。例如,在下面這段代碼中,cobra和mustang都是匿名型別,並且可以彼此設定。
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#版中,開發人員應用許多不同的查詢語言來訪問不同的資料來源。例如,要查詢一個XML檔案,開發人員會使用XPath,要查詢一個SQL資料庫,開發人員將使用SQL。在過去這種方法十分有效,並且現在仍然是訪問各種資料的主要方法。但是,這種方法具有一些缺點。 一個顯著的缺點在於:開發人員必須以一種不同的語言,而非他們當前使用的語言(如SQL或XPath)來編寫查詢代碼。另一個缺點是,在執行某些查詢語言,如SQL時,開發人員必須編寫映射代碼將查詢結果轉化為可用的C#業務對象。
C#3.0推出一種稱之為Language-integrated Query (LINQ)(LINQ)的新方法。應用LINQ,開發人員可以編寫出能夠搜尋任何IEnumerable<T>資料來源的代碼。所以除了應用TSQL訪問MS SQL資料庫,應用XPath訪問XML檔案外,他們還可以應用LINQ。
下面的代碼(列表C)是一個LINQ查詢的例子,它返回所有OrderCount大於10的顧客:
列表C
using System; using System.Query; using System.Collections.Generic;public class SampleClass { static void Main() { List<Customer> customers = GetCustomers(); //Write our query to retrieve customers who have more than // 10 orders. IEnumerable<Customer> queryResult = from customer in customers where customer.OrderCount > 10 orderbycustomer.ID select customer; } } |
與SQL或XPath不同,LINQ查詢用C#,而非第三方語言編寫。這樣,查詢就不會出現類型問題,開發人員也就沒有必要編寫映射代碼把查詢返回的資料轉化成C#對象,而由LINQ API自動處理映射。
基本上,在ORM解決方案中,LINQ對象用途很大。同樣,它的範圍也非常廣泛,有大量MSDM資訊描述了它的功能。欲瞭解更多資訊,請訪問LINQ首頁。
URL: http://dev.yesky.com/msdn/35/2707535.shtml