C 知識點(6)泛型

2021-10-08 08:16:58 字數 2276 閱讀 8723

為什麼需要泛型:編寫程式的時候容易遇到兩個模組功能相近但是引數型別不同,所以分別寫多個方法處理每種資料型別,不能重用同樣功能的**。

用根類object來解決存在的缺陷:

a:會出現裝箱和拆箱的操作,將會在託管堆上分配和**大量的變數,如果數量龐大,效能會損失嚴重。

b:雖然處理引用型別,沒有裝箱和拆箱的操作,但講用到的資料型別強制轉換的時候會增加處理器的負擔

泛型:可以將型別作為引數來傳遞,建立型別的時候用乙個特定的符號「t」來作為佔位符。允許延遲編寫類或者方法中資料型別的規範,也就是等到例項化時候再用乙個實際的型別來替代。

好處:a:解決了多個模組功能相近但是引數型別不同的問題。提高了重用性。

b:相對於用object解決上述問題,泛型不用裝箱拆箱,降低成本。

c: 可以堆泛型引數進行限定以訪問特定資料型別,利用泛型約束。

namespace blog1

static

void

main

(string

args)}}

/*輸出:

a:11 b:10

*/

泛型約束:對能都例項化類的型別種類施加限制。

好處:不讓做一些約束型別不能做的,比如說約束了只能是值型別,方法裡面卻用約束的泛型做值型別不能做的,就會報錯。

常用的約束型別: 約束

作用where t : struct

泛型t是值型別(小數、整數、char、bool、struct)

where t : class

泛型t是引用型別

where t : new()

泛型t具有乙個無引數的構造方法,如果有多個約束,new()要放在最後。不能和struct一起用。

where t : 基類名

泛型t是該基類或者其派生類

where t : 介面名

泛型t是實現了該介面的型別

public

void

test

<

t>

(ref

t a,

reft b)

where t:

struct

約束多個泛型

public

void

test

u>

(ref

t a,

refu b)

where u:

struct

where t:

class

,new()

namespace blog1

public

class

maserati

:car

}//泛型類+約束

public

class

carshop

where t : car

public

void

buy(

t car)

}class

program}}

/*輸出:

進購瑪莎拉蒂

*/

inte***ce

italk

public

class

chinese

: italk

}

自定義泛型委託

namespace blog1

static

void

main

(string

args)}}

/*輸出:

test1 num=1

*/

內建的泛型委託:不用顯示宣告自定義的委託。

func委託:內建的有返回值的泛型委託,可以接受0個至16個傳入引數。

namespace blog1

static

void

main

(string

args)}}

/*輸出:

102*/

action委託:內建的無返回值的泛型委託,可以接受0個至16個傳入引數。

namespace blog1

static

void

main

(string

args)}}

/*輸出:

102*/

Java 泛型知識點

1 在你建立引數化型別的乙個例項時,編譯器會為你負責轉型操作,並且保證型別的正確性。泛型的主要目的之一就是用來指定容器要持有什麼型別的物件,而且由編譯器來保證型別的正確性。示例 public class holder class orange extends fruit fruit 1 new jo...

泛型知識點整理

泛型好處 1 將執行時期的問題classcastexception轉到了編譯時期 2 避免了強制轉換的麻煩 什麼時候用 當操作的引用資料型別不確定的時候,使用 泛型擦除 執行時,會將泛型去掉,生產的class檔案中是不帶泛型的,這個稱為泛型的擦除。泛型補償 執行時,通過獲取元素的型別進行轉換動作,不...

黑馬程式設計師 泛型知識點 總結

asp.net android ios開發 net培訓 期待與您交流!1.泛型,為了適應通用程式設計,我們可以使用型別引數,利用特定的型別,定義我們需要的類。泛型就是乙個抽象層,是型別的模板,用它定義具體的型別,才能例項化對外.2.c 提供5種泛型 類 結構 介面 委託和方法。注意前面4個是型別,而...