1.
visual c# 3.0 新特性概覽
在發布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 ;
上面一行的**將宣告intarr為int.
var關鍵字允許你使用匿名型別的例項,因而這些例項就是靜態型別的。所以,當你建立乙個包含一組資料的物件的例項的時候,你不必要預先定義乙個類可以同時支援這個結構和在乙個靜態型別變數裡的資料。
匿名變數
c# 3.0使得你可以靈活的建立乙個類的例項,而無需先寫這個類的**。所以你可以這樣寫**:
new
class __anonymous1
set }
public string skin set }
public int teeth set }
}
事實上,如果另外乙個滿足了相同的名稱和型別順序的匿名型別也被建立了,編譯器也會聰明的只建立乙個匿名型別來支援兩個例項來使用。同樣,因為例項都是乙個類的簡單例項,它們可以進行互換因為型別實際上是一樣的。
現在你擁有了這個類,但是你還需要一些東西來支援以上的類的某個例項。這就是"var"關鍵字的作用。它讓你擁有乙個以上匿名變數的例項的乙個靜態型別例項。這裡有乙個簡單好用的匿名型別的使用例子:
var frankenstein = new
擴充套件方法
擴充套件方法使你能夠使用額外的靜態方法來擴充套件各種型別。不過它們是非常有限的,也只能在例項方法不足夠的情況下才作為候補使用。
擴充套件方法只能在靜態類中被宣告,並且以關鍵字"this"放在方法的第乙個引數前來標識,如下就是乙個有效的擴充套件方法的例子:
public static int toint32(this string s)
如果乙個包含以上方法的靜態類被使用"using"關鍵字引進,toint32犯法將會出現在已有的型別中(雖然比現有的例項方法優先順序低),你可以這樣編譯和執行**:
string s = "1";
int i = s.toint32();
這使得你可以充分享用各種以有的內建的或者定義的型別的擴充套件特性,並且給它們加上新的方法。
物件和collection初始化符
c# 3.0被希望來允許你包含乙個初始化符,從而指定乙個新建立的物件或者collection的初始值。這使得你能夠一步結合宣告和初始化。
舉例來說,你可以這樣定義coordinate類:
public class coordinate
你然後可以使用乙個物件初始化符來宣告和初始化乙個coordinate物件,就像這樣:
var mycoord = new coordinate ;
也許你要問,為什麼不要像下面這樣做呢?
var mycoord = new coordinate(0, 0) ;
類似的,在c#3.0裡你可以輕鬆的用一種更加簡潔的方式給collection賦值,如下的c# 2.0的**:
listanimals = new list();
animals.add("monkey");
animals.add("donkey");
animals.add("cow");
animals.add("dog");
animals.add("cat");
可以縮短為:
listanimals = new list ;
lambda表示式:匿名方法的濃咖啡
c# 1.x允許你在方法裡寫**段,你可以輕鬆的使用委託(delegate)來呼叫。委託無疑是有用的,並且可以在框架裡任意使用,但是在很多例項裡你必須 為了使用它而宣告乙個方法或者乙個類。因此,為了給你乙個更加容易和簡潔的編碼方式,c# 2.0允許你使用匿名方法替換標準呼叫到委託。如下**可以在.net1.1或者更早的版本看到:
class program
void sayhi()
}
在c# 2.0,使用匿名方法,你必須這樣重寫**:
class program
; mydelegate();
} }
儘管匿名方法對基於方法的委託呼叫更進了一步,但是lambda表示式允許你用更加簡潔,功能性的格式寫匿名方法。
class program
} 儘管lambda表示式顯得更加簡潔,實際上他們也是乙個匿名方法的功能性超集。特別的,lambda表示式提供了如下的額外的功能:
·它們允許引數型別是被推斷的。匿名方法要求你必須清楚的陳述每個型別的狀態。
·它們可以支援查詢表示式或c#語句。
·它們可以被看作使用表示式樹的資料。這是不能用匿名方法來做的。
查詢表示式
這個特性使得你可以在c#中使用sql類似風格的語句,也被稱作linq(語言整合查詢)。
舉例來說,你可以這樣描述你的資料:
ublic class coordinate
在c#裡,你可以像下面一樣輕鬆的宣告乙個資料庫表的邏輯等同式:
// use object and collection initializers
listcoords = ... ;
現在你的資料可以作為乙個collection來實現 ienumerable,你可以輕鬆的像如下方式查詢資料:
var filteredcoords =
from c in coords
where x == 1
select (c.x, c.y)
在以上sql風格的格式中,"from"、"where"和"select"是查詢表示式,用到了c# 3.0的一些特性如匿名型別,擴充套件方法,隱式型別本地變數等。這樣,你可以使用sql風格的格式,將無聯絡的資料整合一起來工作。
每個查詢表示式實際上轉變為乙個c#的呼叫,如:
where x == 1
將會轉換為:
coords.where(c => c.x == 1)
你可以看到,這個看上去很像乙個可怕的lambda表示式和擴充套件方法。c# 3.0還有其他很多關於它們的查詢表示式和規則。
表示式樹
c# 3.0包含了乙個新型別,允許表示式能夠當作執行時的資料使用。這個型別,system.expressions.expression< t>,只是乙個記憶體中乙個lambda表示式的重新表達。結果是你的**可以在執行時修改和檢查lambda表示式。
如下是乙個表示式樹的例子:
expressionfilter = () => console.writeline("hiya!!") ;
使用如上的表示式樹的方法,你可以使用過濾器變數中的各種屬性來檢查樹的內容。
結束語
c# 3.0提供了一些新的特性,使得你可以更輕鬆的完成乙個程式設計師和架構設計師的工作,同時也保持了程式語言的嚴謹和清晰的結構。
c# 3.0目前還處於襁褓中,還將在未來的數月中長大,但是它所能改變的一切,緊靠其強大的後盾.net框架,它的體系結構和設計模式,值得你的關注。
C 3 0 新特性概覽
自從看了scottgu的幾篇文章後就有想讓c 3.0的一些新特性在我的部落格上也留下歷史地一頁。但是由於環境不允許好久都沒有用上.net 3.0,今天終於忍不住地要動一動鍵盤滿足一下自己的慾望,因為我自己的電腦上安裝了.net 3.0 framework sdk。在這裡我總結一下前輩們的研究成果,也...
C 3 0新特性 linq相關
隱含型別區域性變數 var age 26 var username zhuye var userlist new foreach var user in userlist console.writeline user 純粹給懶人用的var關鍵字,告訴編譯器 對於clr來說,它是不會知道你是否使用了v...
C 3 0新特性小結 2
c 3.0中除了自動屬性外,還新增 隱含型別區域性變數 local variable type inference 匿名型別 anonymous types 物件與集合初始化器 object and collection initializers 演示例項 測試陣列 public static vo...