深入理解C 3 0的五項主要改進

2021-04-12 22:44:13 字數 3296 閱讀 6096

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...