焦點關注:Visual C# 3.0 新特性概覽(轉)

ba發表於2007-08-15
焦點關注:Visual C# 3.0 新特性概覽(轉)[@more@]在釋出Visual Studio 2005和C#2.0之後,微軟公司又馬不停蹄的展示了人們所期望的C#的下一代版本:C# 3.0。儘管C# 3.0並沒有標準化,微軟還是在PDC(專業程式設計師會議)釋出了一個預覽版本,因此心急的程式設計師可以看到一些所期望的特性,這也是本文所討論的主要內容:

  ·隱式型別本地變數

  ·匿名變數

  ·擴充套件方法

  ·物件和Collection初始化符

  ·Lambda表示式

  ·查詢表示式

  ·表示式樹

  隱式型別本地變數

C# 3.0引進了一個新的關鍵字叫做"Var"。Var允許你宣告一個新變數,它的型別是從用來初始化符變數的表示式裡隱式的推斷出來的。也就是說,如下的表示式是有效的格式:

var i = 1;

這一行使用了1來初始化符變數i。注意這裡i被強型別到整型,它不是一個物件或者VB6的變數,也不帶有其他物件或者變數的負載。

為了保證使用var關鍵字進行宣告的變數的強型別特性,C#3.0要求你將賦值(初始化符)放到和宣告(宣告符)的同一行。同樣,初始化符必須是一個表示式,不能是一個物件或者collection初始化符,也不能為null。如果多個宣告符對同一個變數存在,那麼它們必須在編譯時被視作相同型別。

另一方面,隱式型別陣列,可以使用一點不同的格式,如下所示:

var intArr = new[] {1,2,3,4} ;

上面一行的程式碼將宣告intArr為int[].

var關鍵字允許你使用匿名型別的例項,因而這些例項就是靜態型別的。所以,當你建立一個包含一組資料的物件的例項的時候,你不必要預先定義一個類可以同時支援這個結構和在一個靜態型別變數裡的資料。

匿名變數

C# 3.0使得你可以靈活的建立一個類的例項,而無需先寫這個類的程式碼。所以你可以這樣寫程式碼:

new {hair="black", skin="green", teethCount=64}

上一行程式碼,透過new關鍵字的幫助,建立了有三個屬性的型別:hair,skin和teethCount。這樣C#編譯器就會建立一個類如下:

class __Anonymous1

{

 private string _hair = "black";

 private string _skin = "green";

 private int _teeth = 64;

 public string hair {get { return _hair; } set { _hair = value; }}

 public string skin {get { return _skin; } set { _skin = value; }}

 public int teeth {get { return _teeth; } set { _teeth = value; }}

}

事實上,如果另外一個滿足了相同的名稱和型別順序的匿名型別也被建立了,編譯器也會聰明的只建立一個匿名型別來支援兩個例項來使用。同樣,因為例項都是一個類的簡單例項,它們可以進行互換因為型別實際上是一樣的。

現在你擁有了這個類,但是你還需要一些東西來支援以上的類的某個例項。這就是"var"關鍵字的作用。它讓你擁有一個以上匿名變數的例項的一個靜態型別例項。這裡有一個簡單好用的匿名型別的使用例子:

var frankenstein = new {hair="black", skin="green", teethCount=64}

擴充套件方法

擴充套件方法使你能夠使用額外的靜態方法來擴充套件各種型別。不過它們是非常有限的,也只能在例項方法不足夠的情況下才作為候補使用。

擴充套件方法只能在靜態類中被宣告,並且以關鍵字"this"放在方法的第一個引數前來標識,如下就是一個有效的擴充套件方法的例子:

public static int ToInt32(this string s)

{

 return Convert.ToInt32(s) ;

}

如果一個包含以上方法的靜態類被使用"using"關鍵字引進,ToInt32犯法將會出現在已有的型別中(雖然比現有的例項方法優先順序低),你可以這樣編譯和執行程式碼:

string s = "1";

int i = s.ToInt32();

這使得你可以充分享用各種以有的內建的或者定義的型別的擴充套件特性,並且給它們加上新的方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-957869/,如需轉載,請註明出處,否則將追究法律責任。

相關文章