泛型的作用是什麼?
泛型的作用在於“算法的重用”。(這點其實很好理解,原來的ArrayList只能接受Object,現在通過List可以接受任何類型,也就是說ArrayList的方法都被各個類型重用了。但是Dot Net的泛型有個比較制肘地方,就是你很難對數值類型(值類型)進行算法抽象,因為這牽涉到運算符重載的問題,同時Dot Net的泛型的類型參數也不能約束成一個基元值類型(如int、double、float) 。)
它有什麼優勢?
第一:源代碼保護。(如果你知道C++模板對泛型的實現機制,就會知道C++在編譯的時候根據對泛型的調用,自動“內聯”了一個實現,這樣泛型的內容就暴露了,爾DotNet的實現方式就不同了,泛型類和方法會被編譯成IL,在執行的時候由JIT負責將IL變化為指定類型參數的本地代碼,從而保護了源代碼)
第二:類型安全。(這點是最顯而易見的,拋棄了使用ArrayList時各種丑陋的強制類型轉換)
第三:更清晰地代碼。因為沒有了強制類型轉換,所以代碼自然顯得更清晰,但是使用泛型時候帶來的<>有時候確實也會讓人搞糊塗,幸好泛型方法可以用類型推斷或者using語句來進一步簡化寫法。
第四:更好的性能,因為值類型可以避免裝箱和拆箱所帶來的損耗(垃圾回收的次數也會減少)。(這點正是泛型神奇的地方,開發歷史上抽象能力的上升往往意味著性能的下降,但是泛型卻不是!泛型抽象了算法,但是C++和DotNet對泛型的實現能夠讓性能無損,並且更快。Java的擦除法泛型就沒有這種性能上的好處。)
它對性能有影響嗎?
對性能有積極的影響,因為值類型可以避免裝箱和拆箱所帶來的負面影響,避免了垃圾回收,使得性能顯著提高。但是對引用類型這種影響就不明顯了。但是需要注意的是首次為一個特定數據類型調用方法時,CLR都會為這個方法生成本地代碼。這會增大應用程序的工作集大小,從而影響性能。
它在執行時的行為是什麼?
使用泛型類型參數的一個方法在進行JIT編譯時,CLR獲取IL,用指定的類型實參進行替換,然後創建本地代碼。需要特別注意的是引用類型是共享代碼的,而對值類型就會為每一種生成獨立的一份類型代碼。但是需要指出的是引用類型的這種代碼共享並不會造成封閉類型只執行一次構造函數(就算是靜態構造函數也是這樣的)。
.NET BCL中有哪些泛型類型?
List、Dictionary、Queue、Stack、SortedList和SortedDictionary、LinkedList等等。
舉例說明平時編程中您定義的泛型類型。
泛型的出現會替換原來一部分使用多態的地方從而提高性能和帶來更好的編譯時檢查,這樣就不需要在子類和超類(接口)間頻繁轉換了。比如你要根據情況打出各種報表,那麼先把報表類定義成泛型類從而可以共享報表一系列的算法。