C#2.0引入了泛型這個特性,由于泛型的引入,在一定程度上極大的增強了C#的生命力,可以完成C#1.0時需要編寫復(fù)雜代碼才可以完成的一些功能。但是作為開發(fā)者,對于泛型可謂是又愛又恨,愛的是其強大的功能,以及該特性帶來的效率的提升,恨的是泛型在復(fù)雜的時候,會呈現(xiàn)相當(dāng)復(fù)雜的語法結(jié)構(gòu)。這種復(fù)雜不僅是對于初學(xué)者,對于一些有開發(fā)經(jīng)驗的.NET開發(fā)者,也是一個不那么容易掌握的特性。
接下來我們來了解一下C#2.0加入的特性:泛型。
一.泛型的基本特性概述:
在實際項目開發(fā)中,任何API只要將object作為參數(shù)類型和返回類型使用,就可能在某個時候涉及強類型轉(zhuǎn)換。提到強類型轉(zhuǎn)換,估計很多開發(fā)者第一反應(yīng)就是“效率”這個次,對于強類型的利弊主要看使用者使用的環(huán)境,天底下沒有絕對的壞事,也沒有絕對的好事,有關(guān)強類型的問題不是本次的重點,不做重點介紹。
泛型是CLR和C#提供的一種特殊機制,支持另一種形式的代碼重用,即“算法重用”。泛型實現(xiàn)了類型和方法的參數(shù)化,泛型類型和方法也可以讓參數(shù)告訴使用者使用什么類型。
泛型所帶來的好處:更好的編譯時檢查,更多在代碼中能直接表現(xiàn)的信息,更多的IDE支持,更好的性能。可能有人會疑問,為什么泛型會帶來這么多好處,使用一個不能區(qū)分不同類型的常規(guī)API,相當(dāng)于在一個動態(tài)環(huán)境中訪問那個API。
CLR允許創(chuàng)建泛型引用和泛型值類型,但是不允許創(chuàng)建泛型枚舉,并且CLR允許創(chuàng)建泛型接口和泛型委托,CLR允許在引用類型、值類型或接口中定義泛型方法。定義泛型類型或方法時,為類型指定了任何變量(如:T)都稱為類型參數(shù)。(T是一個變量名,在源代碼中能夠使用一個數(shù)據(jù)類型的任何位置,都可以使用T)在C#中泛型參數(shù)變量要么成為T,要么至少一大寫T開頭。
二.泛型類、泛型接口和泛型委托概述:
1.泛型類:
泛型類型仍然是類型,所以可以從任何類型派生。使用一個泛型類型并指定類型實參時,實際是在CLR中定義一個新類型對象,新類型對象是從泛型派生自的那個類型派生的。使用泛型類型參數(shù)的一個方法在基尼險那個JIT編譯時,CLR獲取IL,用指定的類型實參進行替換,然后創(chuàng)建恰當(dāng)?shù)谋镜卮a。
如果沒有為泛型類型參數(shù)提供類型實參,那就么就是未綁定泛型類型。如果指定了類型實參,該類型就是已構(gòu)造類型。已構(gòu)造類型可以是開發(fā)或封閉的,開發(fā)類型還包含一個類ixngcanshu,而封閉類型則不是開發(fā)的,類型的每個部分都是明確的。所有代碼實際都是在一個封閉的已構(gòu)造類型的上下文中執(zhí)行。
泛型類在.NET的應(yīng)用主要在集合類中,大多數(shù)集合類在System.Collections.Generic和System.Collections.ObjectModel類中。下面簡單的介紹一種泛型集合類:
(1).SynchronizedCollection:提供一個線程安全集合,其中包含泛型參數(shù)所指定類型的對象作為元素.
[ComVisible(false)] public class SynchronizedCollection&l