C 學習筆記之泛型

2022-07-24 05:09:13 字數 2770 閱讀 5549

拆箱和裝箱從值型別轉換為引用型別為裝箱,把引用型別轉換為值型別為拆箱

裝箱和拆箱很容易使用,但是效能損失比較大,尤其是遍歷許多項的時候。

list不使用物件,在使用時定義型別

var list = new list();

list.add(44); // no boxing

int item = list[0]; // mo unboxing

不妨將list看做一種新的型別,不在特意的和c++的模板相比較;

泛型型別的名稱用t作為字首;

泛型型別允許使用任意類替代,且只使用了乙個泛型型別就可以用t作為泛型型別的名稱

public class list{}

public class linkedlist{}

若泛型型別有特定需求(例如必須實現乙個介面或派生自基類),或者使用了兩個或多個泛型型別

public delegate void eventhandler(object sender, teventargs e);

public delegate toutput converter(tinput from);

public class sortedlist{}

建立泛型時,不能把null賦予泛型型別;在這個時候,我們就需要default,將null賦予引用型別,0賦值於值型別;

public t getdocument()

return doc;

}

若泛型類需要呼叫泛型型別中的方法,就必須新增約束where

泛型支援以下幾種約束型別:

約束說明

where t: struct

對於結構約束,t必須是值型別

where t: class

t必須是引用型別

where t: ifoo

t必須實現介面ifoo

where t: foo

t 必須派生基類foo

where t: new()

建構函式約束,t必須有乙個預設建構函式

泛型型別也可以合併多個約束,where t: ifoo, new()約束和mymerge申明指定,t必須實現ifoo介面,且必須有乙個預設建構函式,示例如下所示:

public class mymergewhere t: ifoo, new()

泛型型別可以實現泛型介面,也可以派生自類,當然也可以派生自泛型基類;

public class base{}

public class derived: base{} // 派生自泛型基類

當然,泛型型別派生自指定基類的型別:

public class base{}

public class derived: base{}

泛型類的靜態成員只能在類的乙個例項中共享

// 定乙個泛型類的靜態成員

public class staticdemo

staticdemo.x = 3; // 第一組靜態字段 = 3

staticdemo.x = 4; // 第二組靜態字段 = 4

console.writeline(staticdemo.x); // 這裡將會輸出3

使用泛型可以定義介面,在介面定義的方法可以帶泛型引數

在.net中,引數型別是協變

例如,有shape和circle類,circle派生自shape,display方法是為了接受shape型別的引數

public void display(shape object){}
現在可以傳遞派生自shape基類的任意物件,例如circle,rectangle

circle c = new circle(5);

display(c); // 這裡便是協變

方法的返回型別是抗變

例如,若方法返回乙個shape,就不能把它賦予circle,但是反過來就可以;

若泛型型別使用out標註,泛型介面就是協變的,意味著返回型別也是t

若泛型型別使用in標註,泛型介面就是抗變的,表明傳入的引數型別只能是t

C 學習筆記之泛型委託

求陣列的最大值 普通委託寫法如下 using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace 求陣列的最大值 匿名函式...

C 學習筆記之 泛型 Generic

泛型是將型別作為引數來傳遞。為什麼這樣說,這裡就有個例子 public void swap int x,int y public void swap char x,char y public void swap string x,string y 可以看到相同的寫法,只是引數不一樣,這樣寫就特別浪費...

C 學習筆記之泛型演算法

先貼個 有時間的再補筆記 1 include2 using namespace std 34 模板類在接收了引數之後會將引數例項化5 自然可以接收 vector和 vector 67 templatevoid print t vec 列印該例項 813 cout 1516 templatevoid ...