裝箱和拆箱很容易使用,但是效能損失比較大,尤其是遍歷許多項的時候。拆箱和裝箱
從值型別轉換為引用型別為裝箱
,把引用型別轉換為值型別為拆箱
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 ...