1. 程式人生 > >1.C#之2.0(在整理當中)

1.C#之2.0(在整理當中)

     以前的十八章都是C#1.0所引入的內容,接下來寫C#2.0引入的幾項語言擴充套件,2.0引入的重要的是泛型、匿名方法、迭代器、不完整型別:

          泛型:可以讓類、結構、介面、委託和方法通過它們所儲存和操作的資料的型別被引數化;它們提供了更強的編譯時型別檢查,減少了顯示轉換,裝箱操作和執行時型別檢查;

          匿名方法:讓程式碼以內聯的方式潛入到期望委託值得地方。它與Lisp程式語言中的λ函式(lambda)相似。C#2.0支援"closures"的建立,在其中匿名方法可以訪問相關佈局變數和引數;

          迭代器:可以遞增計算和產生值的方法。迭代器讓型別指定foreach語句如何迭代它的所有元素變得很容易;

          不完整型別:可以讓類、結構、介面被拆分成多個部分儲存在不同的原始檔中,這更利於開發和維護;此外,不完整型別允許某些型別的機器生成的部分與使用者編寫的部分之間的分離,從而使增加由工具產生的程式碼很容易。

     C#2.0的語言擴充套件主要被設計用於確保與現存的程式碼之間最大的相容性。

  19.1泛型

   19.1.1 為什麼使用泛型

     如果沒有泛型,通用目的的資料結構可以採用object型別儲存任何型別的資料。比如Stack類在一個object陣列中儲存資料,它的兩個方法使用object接受和返回資料:

     這樣雖然讓Stack類更加靈活,但還是有缺點。比如你可以用任何型別的值壓入Push堆疊,但取回一個值是,Pop方法的結果必須被顯示強制轉換為合適的型別,這樣為了一個執行時型別檢查去編寫程式碼而帶來的性格不利影響是很討厭的。這種裝箱和拆箱的操作增加了效能開銷,因為它們涉及動態記憶體分配和執行時型別檢擦。

     Stack類更大的問題是它不能強制放置在堆疊上的資料結構,比如用Customer例項可以壓入堆疊,但取回時可能被強制轉換為錯誤的型別:

     雖然上面的程式碼時Stack類的一種不恰當用法,但程式碼從技術上說是正確的,並不會報告編譯時錯誤,問題會知道程式碼執行時才會冒出來,丟擲一個InvalidCastException異常。

     但如果Stack類具有指定其元素型別的能力,那麼很顯然它能從這種能力得到好處。泛型,使這變得可能。

   19.1.2 建立和使用泛型

     發