對C 中的泛型的理解

2021-07-02 23:11:15 字數 3018 閱讀 3784

泛型是公共語言執行時和程式語言提供的一種機制,它支援另外1種形式的**重用,也就是演算法重用.

泛型包含泛型類,泛型介面,泛型委託,泛型方法,並非只包含簡單的泛型類.在c#中,其他例如,屬性,索引器,事件,操作符方法,構造器本身不能有型別引數t.

t(型別引數),它的目的在於指明它操作的是乙個未指定的資料型別,在源**中能夠使用資料型別的地方都可以使用它.

通過使用泛型,可以極大地提高**的重用度,同時還可以獲得強型別的支援,提公升了應用程式的效能,避免了隱式的裝箱、拆箱,以及執行時的型別轉換錯誤。

冒泡演算法

不用泛型的情況下,如果是整數型別排序,下面**中「?「就應為int型別,但如果這時候我們有需要給byte型別排序,就要複製一遍**,然後把int改為byte。這顯然不能體現**的復用。

public class sorthelper }}

}

做**為了提高**復用,我們通常使用模板它的具體做法是:每次生成靜態頁面時,先載入模板,模板中含有一些用特殊字元標記的佔位符,然後從資料庫讀取資料,使用讀出的資料將模板中的佔位符替換掉。將上面的方法視為乙個模板,將方法所操作的型別視為乙個佔位符,由於是乙個佔位符,因此可以代表任何的型別,這和靜態頁面生成時模板的佔位符可以用來代表來自資料庫中的任何資料道理是一樣的。

public class sorthelper

}

在型別名稱的後面加了乙個尖括號,使用這個尖括號來傳遞佔位符,也就是型別引數。接下來,看一下如何使用泛型。當需要為乙個int型別的陣列排序時:

sorter = new sorthelper();

int array = ;

sorter.bubblesort(array);

當需要為乙個byte型別的陣列排序時:

sorter = new sorthelper();

byte array = ;

sorter.bubblesort(array);

拆裝箱

1.   裝箱在值型別向引用型別轉換時發生

2.   拆箱在引用型別向值型別轉換時發生

**演示

using system;

using system.collections;

using system.collections.generic;

using system.linq;

using system.text;

using system.threading.tasks;

private static void usearraylist()

for (int i = 0; i < listsize; i++)

long endticks = datetime.now.ticks;

console.writeline("使用arraylist,耗時: ticks", endticks - startticks);

}private static void usegenericlist()

for (int i = 0; i < listsize; i++)

long endticks = datetime.now.ticks;

console.writeline("使用list,耗時: ticks", endticks - startticks);}}

}

執行效果

有些經驗的同學就可以看出這段**有問題,因為型別不匹配,新增到arraylist中的是一個int型別,而獲取時卻想將它轉換為string類。但是編譯器不能識別,不管是int也好,string也好,它們都是object型別。在編寫**時,編譯器提供給開發者的最大幫助之一就是可以檢查出錯誤,也就是常稱的編譯時錯誤(compile time error)。當使用arraylist時,對於上面的問題,編譯器無能為力,因為它認為其是合法的,編譯可以順利通過。這種錯誤有時候隱藏在程式中很難發現,最糟糕的情況是產品已經交付使用者,而當使用者在使用時不巧執行到這段**,便會丟擲乙個異常,這時的錯誤,稱為執行時錯誤(runtime error)。

通過使用泛型集合,這種情況將不復存在,當試圖進行類似上面的轉換時,根本無法通

過編譯,這樣有助於盡早發現問題:

listlist = new list();

int i = 100;

list.add(i);

string value = (string)list[0]; // 編譯錯誤

通過以上這些對比,可以看出泛型給我們程式設計提供了很大的方便,當然這些只是我查到的一些資料加上自己

的整理和實踐,如有不足之處請大家批評指正。

對泛型的簡易初步理解

很多人使用過泛型。但是卻一直對泛型迷惑不解,例如arraylist 我們經常使用他。但是卻不知道他的好處。泛型 在我們定義方法時。所要使用的引數可以是 1 int的,可以是 2 string的,可以是 3 陣列,可以是 4 某個物件。但是我們一般不會建立這樣的4個類僅僅引數型別不一樣。我們會建立乙個...

對泛型的簡易初步理解

很多人使用過泛型。但是卻一直對泛型迷惑不解,例如arraylist 我們經常使用他。但是卻不知道他的好處。泛型 在我們定義方法時。所要使用的引數可以是 1 int的,可以是 2 string的,可以是 3 陣列,可以是 4 某個物件。但是我們一般不會建立這樣的4個類僅僅引數型別不一樣。我們會建立乙個...

理解C 泛型

在c 2.0中引入了泛型,泛型的出現解決了編碼中的很多問題。相信大家一定經常用到 system.collections.generic 命名空間中的泛型集合類 generic 就是泛型的意思 在c 1.0中,我們還在使用 system.collections 命名空間中的非泛型集合類,那麼看看我們在...