C 泛型詳解

2021-10-10 15:06:15 字數 1536 閱讀 7371

泛型就是將型別做引數的技術!

詳細一點來說就是:

泛型就是就是使用型別引數定義的資料型別或方法。

平常使用list的時候,我們就在不知不覺中已經使用了泛型。

泛型的語法有倆種.

第一種是在類名後面加上

class

my}```

第二種是在方法名後面加上

```csharp

class

your

}

倆種格式都可以,看個人愛好呼叫。

1、通用性好,講乙個演算法基於型別的不同而復用,避免**膨脹。

例如乙個加法,現在有int 和float兩種型別,我們用泛型只需要寫一遍即可。而不用泛型則需要倆種方法,當然也可以使用object,但是這樣會造成裝箱拆箱,影響效率。

2、型別安全,避免強制型別轉換

3、效能較好、避免裝箱操作

在定義泛型類時,可以對客戶端**能夠在例項化類時

用於型別引數(泛型)的型別種類施加限制。

如果客戶端**嘗試使用某個約束所不允許的型別來例項化類,則會產生編譯時錯誤。

這些限制稱為約束。

約束是使用 where 上下文關鍵字指定的。

總結:限制型別引數代表的資料型別,讓它只代表某類或者某些資料型別。

此處拿基類名做例子講解。

此處提示報錯,型別t中沒有 compareto方法,因為這裡沒有使用泛型約束,編譯器不知道你這個t型別是否有相對的方法,此時我們開啟泛型約束,

進入icomparable中檢視,發現有這個方法。我們呼叫的引數分別是int型別與float型別,這兩個類都繼承這個介面。

在這個max的方法中,我們呼叫了比較的方法,泛型約束就是防止t沒有該方法,軟體執行則會報錯。約束,就是約束你用這個t想做什麼,阿麼t中必須要有對應的方法,可以是繼承自父親或者介面,也可以是自身擁有的。

ps:泛型約束可以有多個,並且是與的關係。

t:struct 型別引數必須是值型別。可以指定除 nullable 以外的任何值型別。 有關更多資訊,請參見 使用可以為 null 的型別(c# 程式設計指南)。

t:class 型別引數必須是引用型別;這一點也適用於任何類、介面、委託或陣列型別。

t:new() 型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時, new() 約束必須最後指定。

t:《基類名》 型別引數必須是指定的基類或派生自指定的基類。

t:《介面名稱》 型別引數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。

常用的是基類名介面名稱,其他的用到的時候再查即可。

C 泛型程式設計詳解

1 模板 模板是泛型程式設計的重要思想,也是c 的精髓之一,c 的stl庫完全通過模板實現 關於stl有興趣的可以去研究一下這個開源專案 對比函式過載,函式模板只需要通過一次函式定義就可以實現不同引數列表和引數型別的函式過載功能,下面是個簡單的模板函式。include include using n...

C 泛型程式設計詳解

泛型程式設計與物件導向程式設計的目標相同,即使重用 和抽象通用概念的技術更加簡單。但是物件導向程式設計強調程式設計的資料方面,泛型程式設計強調的是獨立於特定資料型別。這一篇介紹一下 c 程式設計中與物件導向並列的另一大分支 泛型程式設計,這一篇主要介紹函式模板 類模板和成員模板三大部分 如有侵權,請...

詳解C 泛型裝飾器

目錄 本文簡單寫了個 c 裝飾器,主要使用的是c lamda 表示式,結合完美 技巧,在一定程度上提公升效能 define fieldsetter name,type,field type field 程式設計客棧 name name const type field field field nam...