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方法。
列表anamespacemyextensionmethods}}
在乙個類中匯入這個extension方法時,開發者就能夠對這個類包含的任何字串呼叫nosapces()方法。
extension方法的第乙個引數決定extension方法的有效型別。在這種情況下,「這個字串資料」(this string data)表明extension方法適用於字串類;如果extension方法以「這個物件資料」(this object data)為第乙個引數,則說明這個方法對每個物件有效。
要表明您希望匯入extension方法,只需在它們的命名空間中包括乙個using指令。例如,要應用上面說明的方法,需要在類檔案中包括乙個using myextensionmethods指令:(列表b)
列表busingmyextensionmethods;
namespace mynamespace}}
注意extension方法的優先度比instance方法低。因此如果instance方法和extension方法有同樣的簽名,則應執行instance方法。
3.物件初始化器
在c# 2.0中,開發者認為建立許多構造器來設定某個屬性值為物件初始化過程。下面是乙個例子: 類訪問customer方法:
customer mycustomer = new customer("zach", "**ith");
customer類構造器:
public customer(string firstname, string lastname) : this()
public customer()
{} c# 3.0介紹了乙個初始化物件的新方法,它允許您在初始化物件時設定任何屬性值。例如,在c# 3.0中,上面的**塊可以寫成:
類訪問customer方法:
customer mycustomer = new customer;
customer類構造器:
public customer()
{} 在c# 3.0**中,沒有與初始化物件對應的構造器。這樣,開發者就不用為每組需要設定的屬性建立不同的構造器。
car car = new car(18, 10, 550);
car car = new car ;
4.匿名型別
c# 2.0引入了匿名方法,c# 3.0推出匿名型別。匿名型別與匿名方法類似,它們都是以嵌入方式建立,並沒有正式的名稱。在建立乙個匿名型別,您必須組合上述物件初始化器和隱型區域性變數兩個概念。下面是乙個匿名型別的例子:
varmytype = new ;
匿名型別的範圍與任何其它變數的範圍相同。例如,下面**塊中的cobra例項僅僅在speed函式塊中有效:
private void speed();}
如果乙個匿名型別被初始化而另乙個匿名型別位於範圍域中,並且它們的簽名相同,第二個型別將自己占用第乙個型別的型別。例如,在下面這段**中,cobra和mustang都是匿名型別,並且可以彼此設定。
private void speed()
;var mustang = new ;
mustang = cobra; //or you could say cobra = mustang
} 5 .linq
在之前的c#版中,開發者應用許多不同的查詢語言來訪問不同的資料來源。例如,要查詢乙個xml檔案,開發者會使用xpath,要查詢乙個sql資料庫,開發者將使用sql。在過去這種方法十分有效,並且現在仍然是訪問各種資料的主要方法。但是,這種方法具有一些缺點。 乙個顯著的缺點在於:開發者必須以一種不同的語言,而非他們當前使用的語言(如sql或xpath)來編寫查詢**。另乙個缺點是,在執行某些查詢語言,如sql時,開發者必須編寫對映**將查詢結果轉化為可用的c#業務物件。
c#3.0推出一種稱之為語言整合查詢(linq)的新方法。應用linq,開發者可以編寫出能夠搜尋任何ienumerable
資料來源的**。所以除了應用tsql訪問ms sql資料庫,應用xpath訪問xml檔案外,他們還可以應用linq。
下面的**(列表c)是乙個linq查詢的例子,它返回所有ordercount大於10的顧客:
列表cusing system;
using system.query;
using system.collections.generic;
public class sampleclass
} 與sql或xpath不同,linq查詢用c#,而非第三方語言編寫。這樣,查詢就不會出現型別問題,開發者也就沒有必要編寫對映**把查詢返回的資料轉化成c#物件,而由linq api自動處理對映。
深入理解C 3 0的五項主要改進
1.隱型區域性變數 c 3.0引入了乙個叫做 var 的新關鍵字。這個關鍵字允許開發者建立乙個變數,但不必明確它的型別。例如,用var說明乙個字串,就像這樣 varmydata this is my data 注意,這裡並沒有提到mydata變數是乙個字串,而c 2.0卻要求這一點。雖然var允許您...
關於C 的深入理解
1.關於引用和指標的理解 在我自己看來有兩個方面需要重視!第一是c 中,和 這兩個操作符的用法 1 可以作為宣告乙個指標 也可以用來作用為取值 代表位址指向的儲存單元 2 可以作為宣告乙個引用 也可以用來作用為取位址符號 第二是指標和引用的定義和性質區別 擷取自 inta 1 int p a int...
深入理解c語言指標 第五章
字串是以ascii字元nul結尾的字串行。ascii字元nul表示 為 0。c中有兩種型別的字串。單位元組字串 由char資料型別組成的序列 寬字串 由wchar t資料型別組成的序列 wchar t資料型別用來表示寬字元,要麼是16位寬,要麼是32位寬。這兩種字串都以nul結尾。警告 記住,nul...