5 C 中的泛型

2021-09-12 12:40:16 字數 2014 閱讀 8612

泛型主要的思想是邏輯復用,你不需要為所有的資料結構都寫一遍該邏輯,如元素的比較、排序等,不同的類可以呼叫乙個泛型函式。

主要介紹泛型機制的優點、泛型型別與泛型函式、型別約束與型別推斷

1. 泛型的優點

a. 安全,因為指定了型別,所以不再存在因為型別轉換而出現的型別不安全。

b. 高效,因為不同型別之間的轉換,有時還涉及到值型別與引用型別之間的裝箱與拆箱,會很大的降低效率,有了泛型就不需要這些了。

c. 更簡潔的**,易於維護,因為你一看就知道是什麼型別,不再需要去猜測這裡應該賦什麼型別。

2. 常見的泛型

最常見的就是泛型集合類了,如list等,它有更少的虛函式,所以效能更好。

還有一些泛型介面,如list就實現了泛型介面ilist,此介面包括查詢、排序等函式。

3. 泛型型別

泛型型別包括泛型類、泛型介面、泛型委託、泛型結構等等,在mono執行時,會為各種型別構造內部資料結構,所以需要指定具體的型別。

泛型型別又分為封閉型別與開放型別,封閉型別如dictionary,兩個都指定了為泛型型別,執行時可以通過;而開放型別如dictionary<,>,什麼都沒有指定,執行報錯,會說這是乙個開放型別。同樣的,只指定了乙個引數的也不能執行。

泛型型別也是型別,它和一般類一樣,可以繼承別的型別,也能派生出別的型別。當指定了泛型型別的實參後,並不影響繼承關係。

泛型介面的目的時放置非泛型介面操作值型別是可能引起的裝箱操作。

泛型委託,當需要呼叫的函式的形參有泛型型別時,使用委託呼叫該函式就要用到泛型委託來指定函式的形參型別。這樣可以減少裝箱操作,保證型別安全。這裡需要提到泛型委託型別實參的逆變性和協變性:

逆變性指引數傳遞的相容性,以in標識的引數成為逆變數,只能出現在傳入的位置;

協變性指返回型別的相容性,以out標識的引數稱為協變數,只能出現在輸出的位置,如方法的返回值型別;

使用如下:public delegate tresult func(t arg);

下面演示一下逆變數與協變數的作用:

funcfunc1=null;

hero h=new hero();

object obj=func2(h);//in 的逆變數為輸入,out的協變數為輸出

4. 泛型函式

泛型函式會在函式名後面新增乙個,表示這是泛型函式,這裡的t可以是指定乙個返回型別、指定乙個成員變數的型別或者是引數的型別,一般都是指定引數的型別。比如:void func(t a){},呼叫形式如:func(b);

其實對於所有陣列的基類system.array,它雖然不是泛型類,但是它提供了很多靜態泛型函式,如排序之類的。

5. 型別約束

型別約束主要是縮小傳遞引數的範圍限制,在泛型型別中,可以約束的型別

a. 引用型別約束,t必須是乙個引用型別。expwhere t : class

b. 值型別約束,t必須是值型別。如,expwhere t : struct

c. 建構函式型別約束,對於函式中的t,它可以是值型別,或者類,但是該類有乙個無參建構函式,當呼叫該函式時,就生成乙個物件。func() where t : new()

d. 轉換型別約束,t必須繼承某個類或者實現某些結構體,expwhere t : stream

當有多個約束型別時,它們的順序是(a/b)d(繼承在前,實現在後)c

有些約束型別時互相衝突的,如果有值型別約束,那麼就沒有建構函式型別約束。

約束型別也同一作用於多個泛型型別,如:expwhere t : class where u : struct

6. 型別推斷

有些泛型函式,在呼叫它們時,沒有在<>裡指定泛型型別的型別,那麼,就需要通過實參的型別來推斷每個方法形參的型別了,當第一次呼叫該函式後,該函式的形參型別就確定了,以後再呼叫,實參的型別應與它推斷的型別一致,否則就會報錯。

C 中 的泛型

1 定義乙個泛型類,這個類中某些欄位的型別是不確定的,這些型別可以在類構造的時候確定下來,類似於模板。class testa public string getthesum 2 應用例項 泛型類 class testa public string getthesum 主函式呼叫 static voi...

C 中泛型類,泛型方法,泛型約束實際應用

所謂泛型,即通過引數化型別來實現在同乙份 上操作多種資料型別。泛型程式設計是一種程式設計正規化,它利用 引數化型別 將型別抽象化,從而實現更為靈活的復用。在定義泛型類時,在對客戶端 能夠在例項化類時,可以用型別引數的型別種類施加限制。在搭建底層框架時,是最常見的程式設計方式。泛型類範例 namesp...

C 中泛型的優點

泛型主要有以下幾個優點 1.效能高 定義資料型別,不需要型別轉換,避免拆裝箱帶來的效能損失 2.型別安全 定義允許使用的資料型別,在編譯時檢查型別錯誤,及早發現錯誤。testt.cs using system using system.collections using system.collect...