C# 泛型的含義
基本集合可以包含在諸如類中,但這些集合是沒有類型化的,所以需要把object項轉(zhuǎn)換為集合中實際存儲的對象類型。繼承自SyStem.ObjeCt的任何對象都可以存儲在ArrayList中,所以要特別仔細。假定包含在集合中的某些類型可能導致拋出異常,而且代碼邏輯崩潰。前面介紹的技術可以處理這個問題,包括檢查對象類型所需的代碼。
但是,更好的解決辦法是一開始就使用強類型化的集合類"這種集合類派生于CollectionBase,并可以擁有自己的方法,來添加、刪除和訪問集合的成員,但它可能把集合成員限制為派生于某種基本類型,或者必須支持某個接口。這會帶來一個問題。每次創(chuàng)建需要包含在集合中的新類時,就必須執(zhí)行下列任務之一:
?使用某個集合類,該類己經(jīng)定義為可以包含新類型的項。
?創(chuàng)建一個新的集合類,它可以包含新類型的項,實現(xiàn)所有需要的方法。
一般情況下,新的類型需要額外功能,所以常常需要用到新的集合類,因此創(chuàng)建集合類會花費大量時間。
另一方面,泛型類大大簡化了這個問題。泛型類是以實例化過程中提供的類型或類為基礎建立的,可以毫不費力地對對象進行強類型化。對于集合,創(chuàng)建“T類型對象的集合”十分簡單,只需要編寫一行代碼即可。不使用下面的代碼:
CollectionClass items = new CollectionClass();
items.Add(new ItemClass());
而是使用:
CollectionClass<ItemClass> items = new CollectionClass<ItemClass>();
items.Add(new ItemClass());
尖括號語法是把類型參數(shù)傳遞給泛型類型的方式。在上面的代碼中,應把CollectionClass<ItemClass>看成 ItemClass的CollectionClass。
泛型不只涉及集合,但集合特別適合使用泛型。本章后面介紹?ystem.Collections.Generic名稱空間時會看到 這一點。創(chuàng)建一個泛型類,就可以生成一些方法,它們的簽名可以強類型化為我們需要的任何類型,該類型甚至可以是值類型或引用類型,處理各自的操作。還可以把用于實例化泛型類的類型限制為支持某個給定的接口,或派生自某種類型,從而只允許使用類型的一個子集。泛型并不限于類,還可以創(chuàng)建泛型接口、泛型方法(可以在非泛型類上定義),甚至泛型委托。這將極大地提高代碼的靈活性,正確使用泛型可以顯著縮短開發(fā)時間。
那么該如何實現(xiàn)泛型呢?通常,在創(chuàng)建類時,它會編譯為一個類型,然后在代碼中使用。讀者可能認為,在創(chuàng)建泛型類時,它只有被編譯為許多類型,才能進行實例化。幸好并不是這樣:在.NET中,類有無限多個。在后臺,.NET運行庫允許在需要時動態(tài)生成泛型類。在實例化之前,B的某個泛型類A甚至不存在。
點擊加載更多評論>>