atitit.泛型程式設計總結最佳實務 vO99 java c++ c#.net php,
atitit.泛型程式設計總結最佳實務 vO99 java c++ c#.net php
\
1. 泛型曆史 1
由來 1
2. 泛型的機制編輯 1
機制 1
編譯機制 2
3. 泛型方法定義1::前定義 2
4. 泛型方法定義2::後定義,方法也需要加<T>標籤... 2
5. 調用泛型方法::: cls.<String>meth(); 2
6. //反回值為範型 2
7. 參考 3
1. 泛型曆史
泛型程式設計(Generic Programming)最初提出時的動機很簡單直接:發明一種語言機制,能夠協助實現一個通用的標準容器庫。所謂通用的標準容器庫,就是要能夠做到,比如用一個List類存放所有可能類型的對象這樣的事;泛型程式設計讓你編寫完全一般化並可重複使用的演算法,其效率與針對某特定資料類型而設計的演算法相同。泛型即是指具有在多種資料類型上皆可操作的含意,與模板有些相似。STL巨大,而且可以擴充,它包含很多電腦基本演算法和資料結構,而且將演算法與資料結構完全分離,其中演算法是泛型的,不與任何特定資料結構或物件類型系在一起。
由來
泛型程式設計最初誕生於C++中,由Alexander Stepanov[2]和David Musser[3]創立。目的是為了實現C++的STL(標準模板庫)。其語言支援機制就是模板(Templates)。模板的精神其實很簡單:參數化型別。換句話說,把一個原本特定於某個類型的演算法或類當中的類型資訊抽掉,抽出來做成模板參數T。比如qsort泛化之後就變成了:
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請註明來源: http://blog.csdn.net/attilax
2. 泛型的機制編輯機制
C#泛型代碼在被編譯為IL代碼和無資料時,採用特殊的預留位置來表示泛型型別,並用專有的IL指令支援泛型操作。而真正的泛型執行個體化工作以"on-demand"的方式,發生在JIT編譯時間。
編譯機制
1. 第一輪編譯時間,編譯器只為Stack<T>(棧演算法)類型產生“泛型版”的IL代碼與中繼資料-----並不進行泛型型別的執行個體化,T在中間只充當預留位置
2. JIT編譯時間,當JIT編譯器第一次遇到Stack<int>時,將用int替換“泛型版”IL代碼與中繼資料中的T---進行泛型型別的執行個體化。CLR為所有型別參數為“參考型別”的泛型型別產生同一份代碼;但如果型別參數為“值類型”,對每一個不同的“值類型”,CLR將為其產生一份獨立的代碼。
3. 泛型方法定義1::前定義
public static <atiType,retType> retType reduceO4(atiType obj, Func function) {
4. 泛型方法定義2::後定義,方法也需要加<T>標籤...
public void bindList2grid<T>(List<T> li, DataTable dt)
{
5. 調用泛型方法::: cls.<String>meth();6. //反回值為範型
public static T getValue<T>(object entity, string fieldName)
7. 參考
paip.使用泛型時未能找到類型或命名空間名稱“T - attilax的專欄 - 部落格頻道 - CSDN.NET.htm
paip.自訂java 泛型類與泛型方法的實現總結 - attilax的專欄 - .
對於模板與泛型程式設計的問題為何第一次模板的執行個體化沒有問題,準確地匹配出'c',第二種編譯報錯?
這是由於第一個傳入的是 const char*,指標可以 + 操作
第二個傳入的是 string,string 沒有支援的 + 操作
+ 操作出現在這一句 if(*(input+count)==elem)
把這句改成
if(input[count]==elem),因為const char* 和 string 都支援[]操作
這樣就可以編譯通過了
java泛型的問題 一個泛型類 如果要執行個體化他 肯定是這樣建立對象 Class<Object> c = new Class<Object>
雖然是泛型的,但你也可以不指定具體的類型,如果你不指定具體類型,預設可以使用任何類型(但基本類型除外),只不過不指定具體類型,會造成資料不一致性,因此在開發時為了便於資料的操作,通常指定具體類型。