隱型局部變量 C#
引入了一個叫做
var
的新關鍵字
這個關鍵字允許開發者建立一個變量
但不必明確它的類型
例如
用var說明一個字符串
就像這樣
varmyData =
This is my data
;
注意
這裡並沒有提到myData變量是一個字符串
而C#
卻要求這一點
雖然var允許您建立隱含的類型
它並沒有降低C#濃厚的類型特征
var關鍵字只有在建立變量時有用
一旦您建立變量並且確定它的類型以後
就不能再用var來改變一個變量的類型
例如
這段代碼沒有作用
varmyDate = DateTime
Now;
myDate =
Hello
;
使用var關鍵字還會產生一個有趣的結果
它可以幫助開發者減少建立變量時的代碼輸入
例如
在C#
中建立一個Customer對象
需要輸入以下代碼
Customer myCustomer = new Customer();
使用新的var關鍵字
則只要輸入
varmyCustomer = new Customer();
var關鍵字的另一個特點在於
使用它可以避免改變一個返回某個類型對象的方法調用
例如
在C#
中
如果您需要調用一個返回Customer對象的方法
您應該編寫以下代碼
Customer myCustomer = GetByName(
Zach
);
如果某個時候GetByName方法返回一個不是Customer的對象
這段代碼就無法編譯
但是
如果應用var關鍵字
您就不用擔心GetByName返回的對象類型
varmyData = GetByName(
Zach
);
現在
因為應用了var關鍵字
GetByName方法能夠進行改變
返回一個Person對象
這個方法調用也依然有效
extension方法 在C#中
您不能繼承和擴充用訪問標識符標記為
封裝
的類型
但在C#
中
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方法
對象初始化器
在C# 中開發者認為建立許多構造器來設定某個屬性值為對象初始化過程下面是一個例子 類訪問Customer方法
Customer myCustomer = new Customer(Zach Smith);
Customer類構造器
public Customer(string firstName string lastName) : this()
{
thisFirstName = firstName;
thisLastName = lastName;
}
public Customer()
{}
C# 介紹了一個初始化對象的新方法它允許您在初始化對象時設定任何屬性值例如在C# 中上面的代碼塊可以寫成
類訪問Customer方法
Customer myCustomer = new Customer{FirstName = Zach LastName = Smith };
Customer類構造器
public Customer()
{}
在C# 代碼中沒有與初始化對象對應的構造器這樣開發者就不用為每組需要設定的屬性建立不同的構造器
這樣產生的另外一個效果是代碼變得更容易閱讀了例如雖然我們清楚知道下面的代碼對一個Car對象進行了初始化但我們並不清楚其中變量的作用
Car car = new Car( );
一眼看來下面這行代碼更易閱讀盡管我們必須輸入更多代碼
Car car = new Car { WheelDiameter = WheelWidth = Horsepower = };
匿名類型
C# 引入了匿名方法C# 推出匿名類型匿名類型與匿名方法類似它們都是以嵌入方式建立並沒有正式的名稱在建立一個匿名類型您必須組合上述對象初始化器和隱型局部變量兩個概念下面是一個匿名類型的例子
varmyType = new { Length = Width = };
匿名類型的范圍與任何其它變量的范圍相同例如下面代碼塊中的cobra實例僅僅在Speed函數塊中有效
private void Speed()
{
var cobra = new { Horsepower = Torque = };
}
如果一個匿名類型被初始化而另一個匿名類型位於范圍域中並且它們的簽名相同第二個類型將自己占用第一個類型的類型例如在下面這段代碼中cobra和mustang都是匿名類型並且可以彼此設定
private void Speed()
{
var cobra = new { Horsepower = Torque = };
var mustang = new { Horsepower = Torque = };
mustang = cobra; //or you could say cobra = mustang
}
LINQ
在之前的C#版中開發者應用許多不同的查詢語言來訪問不同的數據源例如要查詢一個XML文件開發者會使用XPath要查詢一個SQL數據庫開發者將使用SQL在過去這種方法十分有效並且現在仍然是訪問各種數據的主要方法但是這種方法具有一些缺點 一個顯著的缺點在於開發者必須以一種不同的語言而非他們當前使用的語言(如SQL或XPath)來編寫查詢代碼另一個缺點是在執行某些查詢語言如SQL時開發者必須編寫映射代碼將查詢結果轉化為可用的C#業務對象
C#推出一種稱之為語言集成查詢(LINQ)的新方法應用LINQ開發者可以編寫出能夠搜索任何IEnumerable<T>數據源的代碼所以除了應用TSQL訪問MS SQL數據庫應用XPath訪問XML文件外他們還可以應用LINQ
下面的代碼(列表C)是一個LINQ查詢的例子它返回所有OrderCount大於的顧客
列表C
using System;
using SystemQuery;
using SystemCollectionsGeneric;
public class SampleClass
{
static void Main()
{
List<Customer> customers = GetCustomers();
//Write our query to retrieve customers who have more than
// orders
IEnumerable<Customer> queryResult = from customer in customers
where customerOrderCount >
orderbycustomerID
select customer;
}
}
與SQL或XPath不同LINQ查詢用C#而非第三方語言編寫這樣查詢就不會出現類型問題開發者也就沒有必要編寫映射代碼把查詢返回的數據轉化成C#對象而由LINQ API自動處理映射
基本上在ORM解決方案中LINQ對象用途很大同樣它的范圍也非常廣泛有大量MSDM信息描述了它的功能欲了解更多信息請訪問LINQ主頁
From:http://tw.wingwit.com/Article/program/ASP/201311/21719.html