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的實際型別動態自動分派乙個處理函式。最容易想到的方案,蠻幹法 寫一大堆過載函式.不過這種方法會有很強的依賴性。也提供了一...