C 學習入門(九) 泛型

2021-10-10 15:08:19 字數 2139 閱讀 8926

3. 泛型類的約束

4. 泛型類中的靜態成員

5. 泛型類的繼承

6. 泛型方法

泛型(generic type)是指將資料型別的定義用引數表示,以達到在同乙份**上用於多種資料型別的操作,提高**的復用。通過泛型可以定義型別安全的資料結構,而無須使用實際的資料型別,從而顯著提高效能,並得到更高質量的**。泛型型別不是型別,而是型別的模版。泛型程式設計是一種程式設計正規化,它利用「引數化型別」將型別抽象化,從而實現更為靈活的復用。

比如,我們寫乙個交換函式,使用c語言編寫的話,需要int型、float型等等的多個交換函式,但他們的內容卻差不多,演算法是一樣的,這時候使用c編寫效率很低。引入泛型後,可以完美地解決這個問題,通過傳入引數即可。

static

void

swap

<

t>

(ref

t a,

reft b)

訪問修飾符 class 泛型類名《型別引數列表》

定義泛型類

public

class

point

,", x, y);}

}

呼叫泛型類

static

void

main

(string

args)

限制了型別引數列表只能是繼承至基類名的子類。

訪問修飾符 class 泛型類名《型別引數列表》

where 型別引數 : 基類名

限制了泛型型別只能是實現了某介面的類。

訪問修飾符 class 泛型類名《型別引數列表》

where 型別引數 : 介面名

限制了泛型型別只能含有無引數的建構函式

訪問修飾符 class 泛型類名《型別引數列表》

where 型別引數 :

new(

)}

兩個不同資料型別的泛型,那麼其中的靜態成員是不一樣的。也就是說,其實兩個類並不是同乙個類。

非泛型類繼承泛型類,那麼泛型類的型別必須例項化。

class

aclassb:

a<

int>

//泛型的型別已經例項化為a

泛型類可以繼承非泛型類

class

aclass

b: a

class

cclassd:

c<

string

,int

>

// e型別為c型別提供了u、v,也就是說**於子類

class

e: c

//f型別繼承於c,可以看成f繼承乙個非泛型的類

class

f: c<

string

,int

>

訪問修飾符 返回值型別 方法名《型別引數列表》

(形參列表)

where 型別引數 : 約束條件

如交換函式:

static

void

swap

<

t>

(ref

t a,

reft b)

int a =

1, b =2;

swap

<

int>

(a, b)

;

如類中的泛型函式:

在呼叫泛型方法時,c#編譯器基於傳入的引數型別來推斷出正確的型別,並且它允許完全省略型別規範,稱為泛型推理。

public

class

myclass

}myclass myclass1 =

newmyclass()

;myclass1.

somemethod(3

);//泛型推理機制呼叫泛型方法,按int呼叫泛型方法

C 泛型程式設計入門

所謂泛型程式設計,就是不依賴於某一具體型別而使 具有很強適應性的程式設計正規化。我們看下面的求和函式是如何一步步進化成最純粹的泛型程式設計的。最開始,sum函式是這樣子的 double sum const std vector vec return result 顯然這個函式只適用於std vect...

C 入門(十三)泛型

最終改寫為 前言我就直接用ppt截圖來展示了,省點力氣。這樣我們就可以通過public void sort t t arr 方法對各種型別的陣列進行排序。這個方法也叫做泛型方法。相同的,我們也可以在類名之後加乙個 t 來定義乙個泛型類。想到這裡我們應該可以回顧原來學習的list t 陣列,以及在u3...

C 泛型入門例項

static void main string args 使用初始化器新增資料 增 array.add 1000 array.addrange new int addrange批量增加,陣列和列表 array.addrange array2 刪 刪到找到的第乙個 沒找到也不發生什麼 3 刪除一定範圍...