【泛型——這才真正的理解你】

我是太陽啦啦啦發表於2016-11-25

前言:

曾記得那是機房重構,曾記得那是剛剛聽說有泛型這個東西,曾記得自己實現了datatable轉泛型的例項,而面對泛型,只知道它像一個集合一樣,儲存著資訊。然而,今天對於泛型的認識,讓我認識到了什麼才是學習?每個階段該如何去學習?這篇部落格,小編主要帶大家來理解什麼是泛型以及泛型的優缺點。

核心:

一、定義

泛型是具有佔位符(型別引數)的類、介面和方法,這些佔位符是類、結構、介面和方法所儲存或使用的一個或多個型別的佔位符。
這個定義,可能不好理解。


首先我們從它的英文出發:泛型的英語:generic,即通用的意思,用日常生活的例子來理解就是一個模子。什麼是模子呢?比如:桶,桶可以用來裝水,牛奶,豆漿等等,因此它們會有桶的形狀,及桶的特徵,我們的這個泛型,就是這樣,泛型就是一個模板型別,實現的時候可以把int,string等型別放入泛型中,如List<int>的例項就可以用List<T>泛型中定義的所有方法。


應用泛型,可把泛型比作一個黑盒子,我們不考慮盒子具體裡面是什麼型別,我們關注的是對盒子的處理, 此時我們不針對具體物件程式設計,給了一個型別,把它應用到泛型,就具有了泛型的特性。

二、泛型宣告

引入:System.Collections.Generic 名稱空間

List<T>的基本用法:

1.建立一個普通的泛型集合類

List<T>mylist=new List<T>();

T為列表元素的型別:

List<string> mylist = new List<string>();

2.新增列表中的元素

List.Add(T item)

基本的泛型,我們在機房重構的時候接觸過:請看之前的總結部落格:點選開啟連結


三、為什麼要引入泛型呢?下面來看它的優點:

•型別安全

為什麼用了泛型就型別安全了呢!使用泛型可以使泛型知道變數的型別限制,進而可以在更高程度上驗證型別假設,假設沒有泛型,型別安全主要由程式設計師來把握

•程式碼重用

程式碼重用,舉個例子吧!現在有一個需求,需要比較兩個整型數的大小,需要一個方法。假如又需要比較兩個字串的大小,是不還需要一個方法呢,如果再來個比較小數的大小呢?如果用泛型的話,一個方法就OK了,因為需求中只是比較的型別不同,實現方式是完全一樣的,這時可以利用泛型把任何型別當做引數傳入到這個型別中去例項化為具體型別的比較。減少了程式碼量,以後有這樣的需求的話直接用這個方法就好了!

•高效能

這個可以做一個具體的例項,使用泛型的速度比非泛型執行的時間短。
泛型不必對元素進行裝箱,那麼什麼是裝箱呢?所謂裝箱,就是把值型別打包到Object引用型別的一個例項;

int i = 123;
object o =(object) i ; //boxing

•消除強制型別轉換

泛型不必裝箱,用一個通過的資料型別T來代替object,在類例項化時指定T的型別,執行時(Runtime)自動編譯為原生程式碼,執行效率和程式碼質量都有很大提高,並且保證資料型別安全。

通過強型別支援+泛型引數約束,決定了在編譯時就可找到不符合引數型別要求的地方,從而保證了編譯時的型別安全,避免了執行時的型別轉換錯誤。


總結

學習的道路永遠沒有終止,泛型的知識點還有很多很多,期待自己去學習和挖掘!

相關文章