第十一章 泛型

2021-08-08 13:41:44 字數 1956 閱讀 4668

1、泛型概述

使用泛型可以創造出更靈活的類,定義這種引數化類,可以使內部演算法相同,但資料型別會跟隨型別引數而變。

優點:型別安全:指定型別引數後,編譯時會進行型別檢查。

效能優化:減少效能消耗,避免裝箱和拆箱操作。

**重用:避免編寫大量重複的**。

2、泛型類的使用

2.1 定義泛型類

public class stack

private t _items;

public void push(t data)

2.2 使用泛型類

class program

public void main()

stackpath = new stack();

path.push(10);

3、泛型的其他使用方式

3.1 預設值

在使用泛型定義型別時,不能用null對型別進行初始化,因為泛型也可能被例項化為值型別。可以使用default解決這個問題,default自動為引用型別初始化null,為值型別初始化0。

public void push(t data)

t test = default(t);

3.2 介面與結構

c#支援在語言中全面使用泛型,其中包括介面和結構,使用語法與類的語法完全相同

inte***ce ipair

t first

t second

3.3 多個型別引數

inte***ce ipair

4、約束

在定義泛型時,可以對例項化類時提供的型別引數施加限制。如果建立例項時嘗試使用約束不允許的型別,則會發生編譯錯誤。

建立約束的語法:class 類名《型別引數》 where 型別引數:約束

4.1 引用型別約束

class samplewhere t : class

表示t必須是引用型別,包括inte***ce、陣列等。

4.2 值型別約束

class samplewhere t : struct

表示t必須是值型別,包括int、char、struct等。

4.3 類型別約束

class samplewhere t : stream

表示t必須是stream類或者stream的子類

sample有效,符合約束

sample無效,string無法通過引用或裝箱拆箱強制轉換為stream

4.4 介面約束

class samplewhere t : idisposable

表示t必須實現了idisposable介面

sample有效,sqlconnection實現了idisposable介面

sample無效,stringbuilder沒有實現idisposable介面

4.5 建構函式約束

class samplewhere t : stream , new()

表示t必須是stream或stream的子類,並且必須提供無參的建構函式

4.6 組合約束

對型別引數的約束可以是多個,但要注意以下幾點:

約束只能是一種型別,所以,struct和class不能同時存在。

每個值型別都提供預設建構函式,所以,struct和new()不能同時存在。

class必須是第乙個約束。

new()必須是最後乙個約束。

類必須在介面的前面。

4.7 約束的限制

不支援用約束限制類必須實現特定的方法或操作符,所以泛型型別不能使用操作符。

假如型別引數提供多個約束,編譯器認為不同的約束之間是and關係,不能在約束之間指定or關係

委託型別、陣列型別和列舉型別不能在約束中使用,因為他們都是「密封」型別。

建構函式約束只針對預設建構函式,不支援有引數建構函式。

第十一章 泛型演算法

1 演算法 find,count 讀演算法,標頭檔案algorithm copy,replace,replace copy 寫演算法,標頭檔案algorithm find first of,accumulate 讀演算法,標頭檔案numeric fill,fill n 寫演算法,標頭檔案xutili...

c Primier 第十一章 泛型演算法

使用泛型演算法必須包含algorithm標頭檔案 include 標準庫還定義了一組泛化的算術演算法,使用這些演算法則必須包含numberic標頭檔案 include int sum accumulate vec.begin vec.end 42 find first of size t cnt l...

modern c design 第十一章

本章介紹了經常遇到的雙分派的一種泛型解決方案。c 在語法上實現了單分派,即虛函式,通過動態機制選擇相應的函式。雙分派是形如fun object1 a,object2 b 根據a和b的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...