C# 2.0引入了很多語言擴充,最重要的就是泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和不完全類型(Partial Types)。
● 泛型允許類、結構、介面、委託和方法通過它們所存貯和操作的資料的類型來參數化。泛型是很有用的,因為它提供了更為強大的編譯期間類型檢查,需要更少的資料類型之間的顯式轉換,並且減少了對裝箱操作的需要和運行時的類型檢查。
● 匿名方法允許在需要委託值時能夠以“內聯(in-line)”的方式書寫代碼塊。匿名方法與Lisp語言中的拉姆達函數(lambda functions)類似。
● 迭代器是能夠增量地計算和產生一系列值得方法。迭代器使得一個類能夠很容易地解釋foreach語句將如何迭代他的每一個元素。
● 不完全類型允許類、結構和介面被分成多個小塊兒並存貯在不同的源檔案中使其容易開發和維護。另外,不完全類型可以分離機器產生的代碼和使用者書寫的部分,這使得用工具來加強產生的代碼變得容易。
這一章首先對這些新特性做一個簡介。簡介之後有四章,提供了這些特性的完整的技術規範。
C# 2.0中的語言擴充的設計可以保證和現有代碼的高度的相容性。例如,儘管C#2.0在特定的環境中對單詞where、yield和partial賦予了特殊的意義,這些單詞還是可以被用作標識符。確實,C# 2.0沒有增加一個會和現有代碼中的標識符衝突的關鍵字。
1.1 泛型
泛型允許類、結構、介面、委託和方法通過它們所存貯和操作的資料的類型來參數化。C#泛型對使用Eiffel或Ada語言泛型的使用者和使用C++模板的使用者來說相當親切,儘管它們也許無法忍受後者的複雜性。
1.1.1 為什麼泛型?
沒有泛型,一些通用的資料結構只能使用object類型來存貯各種類型的資料。例如,下面這個簡單的Stack類將它的資料存放在一個object數組中,而它的兩個方法,Push和Pop,分別使用object來接受和返回資料:
public class Stack
{
object[] items;
int count;
public void Push(object item) {...}
public object Pop() {...}
}
儘管使用object類型使得Stack類非常靈活,但它也不是沒有缺點。例如,可以向堆棧中壓入任何類型的值,譬如一個Customer執行個體。然而,重新取回一個值得時候,必須將Pop方法返回的值顯式地轉換為合適的類型,書寫這些轉換變更要提防運行時類型檢查錯誤是很乏味的:
Stack stack = new Stack();
stack.Push(new Customer());
Customer c = (Customer)stack.Pop();
如果一個實值型別的值,如int,傳遞給了Push方法,它會自動裝箱。而當待會兒取回這個int值時,必須顯式的類型轉換進行拆箱:
Stack stack = new Stack();
stack.Push(3);
int i = (int)stack.Pop();
&n</