C#2.0,在2005年已經可以使用了,它有一些主要的新功能。這樣使得目前使 用的一些最好的實際經驗可能會有所改變,這也會隨著下一代工具的發布而修改 。儘管目前你還可以不使用這些功能,但你應該這些做些準備。
當 Visual Studio .net2005發布後,會得到一個新的開發環境,升級的C#語言。附 加到這門語言上的內容確實讓你成為更有工作效率的開發人員:你將可以寫更好重 用的代碼,以及用幾行就可以寫出更進階的結構。總而言之,你可以更快的完成 你的工作。
C#2.0有四個大的新功能:範型,迭代,匿名方法,以及部分類型。這些新功能的主要目的就是增強你,做為一個C#開發的開發效率。這一原 則會討論其中的三個新功能,以及為什麼你要為些做準備。與其它新功能相比,範型在對你如何開發軟體上有更大的影響。範型並不是C#的特殊產物。為了實現 C#的範型,MS已經擴充了CLR以及MS的中繼語言(MSIL)。C#,託管C++,以及 VB.Net都將可以使用範型。J#也將可以使用這些功能。
範型提供了一種 “參數的多太”,對於你要利用同一代碼來建立一系列相似的類來說 ,這是一個很神奇的方法。當你為範型參數供一個特殊的類型,編譯器就可以生 成不同版本的類。你可以使用範型來建立演算法,這些演算法與參數化的結構相關的 ,它們在這些結構上實行演算法。你可以在.net的Collection名字空間中找到很多 候選的範型:HashTables, ArrayList,Queu,以及Stack都可以儲存不同的對象 而不用管它們是如何?的。這些集合對於2.0來說都是很好的範型候選類型, 這在System.Collections.Generic存在範型,而且這些對於目前的類來說都一個 副本。C#1.0是儲存一個對System.Obejct類型的引用,儘管當前的設計對於這一 類型來說是可重用的,但它有很多不足的地方,而且它並不是一個型別安全的。 考慮這些代碼:
ArrayList myIntList = new ArrayList( );
myIntList.Add(32 );
myIntList.Add(98.6 );
myIntList.Add ("Bill Wagner" );
這編譯是沒問題的,但這根本無 法表明你的意思。你是真的想設計這樣一個容器,用於儲存總完全不同的元素嗎 ?或者你是想在一個受到限制的語言上工作嗎?這樣的實踐意味著當你移除集合 裡的元素時,你必須添加額外的代碼來決定什麼樣的對象事先已經存在這樣的集 合中。不管什麼情況,你須要從 System.Object強制轉化這些元素到實際的你要 的類型。
這還不只,當你把它們放到1.0版(譯註:是1.0,不是1.1)的集 合中時,實值型別的開銷更特殊。任何時候,當你放到個實值型別資料到集合中時, 你必須對它進行裝箱。而當你在從集合中刪除它時,你又會再開銷一次。這些損 失雖然小,但對於一個有幾千元素的大集合來說,這些開銷就很快的累積起來了 。通過為每種不同的實值型別產生特殊的代碼,範型已經消除了這些損失。
如果你熟悉C++的模板,那麼對於C#的範型就不存在什麼問題了,因為這 些從文法上講是非常相似的。範型的內部的工作,不管它是怎產的,卻是完全不 同的。讓我們看一些簡單的例子來瞭解東西是如何工作的,以及它是如何?的 。考慮下面某個類的部份代碼:
public class List
{
internal class Node
{
internal object val;
internal Node next;
}
private Node first;
public void AddHead( object t )
{
// ...
}
public object Head()
{
return first.val;
}
}