C#提供了一個(gè)非常方便的東西——泛型,那么什么是泛型,泛型有哪些好處,如何使用泛型?下面就做一個(gè)詳細(xì)的介紹:
1、什么是泛型?
通過(guò)泛型可以定義類型安全類,而不會(huì)損害類型安全、性能或工作效率
2、實(shí)例化泛型
(1)可以使用任何類型來(lái)聲明和實(shí)例化
(2)申明和實(shí)例話都必須用一個(gè)特定的類型來(lái)代替一般類型T
(3)舉例說(shuō)明:
//原來(lái)寫(xiě)法
Public class Stack
{
object[] m_Items;
public void Push(object item)
{...}
public object Pop()
{...}
}
Stack stack = new Stack();
stack.Push(1);
int number = (int)stack.Pop();
//有了泛型后
Public class Stack <T>
{
T[] m_Items;
public void Push(T item)
{...}
public T Pop()
{...}
}
Stack <int> stack = new Stack <int> ();
stack.Push(1);
int number = (int)stack.Pop();
3、泛型的好處
(1)一次性的開(kāi)發(fā)、測(cè)試和部署代碼,通過(guò)任何類型來(lái)重用它
(2)編譯器支持和類型安全
(3)不會(huì)強(qiáng)行對(duì)值類型進(jìn)行裝箱和取消裝箱,或者對(duì)引用類型進(jìn)行向下強(qiáng)制類型轉(zhuǎn)換,所以性能得到顯著提高。
注:值類型大概可以提高200%,引用類型大概為100%
4、多個(gè)泛型
單個(gè)類型可以定義多個(gè)泛型
5、泛型別名
(1)在文件頭部使用using 為特定類型取別名,別名作用范圍是整個(gè)文件
(2)舉例說(shuō)明
using List = LinkedList <int,string> ;
class ListClient
{
static void Main(string[] args)
{
List list = new List();
list.AddHead(123, "AAA ");
}
}
6、泛型約束
A 派生約束
如:
public class LinkedList <K,T> where K:IComparable
{
T Find(K key)
{
if (str.Key.CompareTo(key) == 0)//只有實(shí)現(xiàn)這個(gè)接口才可比較
}
}
注意:
(1)所有的派生約束必須放在類的實(shí)際派生列表之后
如:public class LinkedList <K,T> :IEnumerable <T> where K:IComparable <K> {...}
(2)一個(gè)泛型參數(shù)上可以約束多個(gè)接口(用逗號(hào)分隔)
public class LinkedList <K,T> where K:IComparable <K> ,IConvertible
(3)在一個(gè)約束中最多只能使用一個(gè)基類
(4)約束的基類不能是密封類或靜態(tài)類
(5)不能將System.Delegate或System.Array約束為基類
(6)可以同時(shí)約束一個(gè)基類以及一個(gè)或多個(gè)接口,但是該基類必須首先出現(xiàn)在派生約束列表中。
(7)C#允許你將另一個(gè)泛型參數(shù)指定為約束
public class MyClass <T,U> where T:U
{...}
(8)可以自己定義基類或接口進(jìn)行泛型約束
(9)自定義的接口或基類必須與泛型具有一致的可見(jiàn)性
B構(gòu)造函數(shù)約束
如:
class Node <K,T> where T:new()
{
}
注意:
可以將構(gòu)造函數(shù)的約束和派生約束結(jié)合起來(lái),前提是構(gòu)造函數(shù)的約束出現(xiàn)在約束列表中的最后
C引用/值類型約束
(1)可以使用struct約束將泛型參數(shù)約束為值類型(如int、bool、enum),或任何自定義結(jié)構(gòu)
(2)同樣可以使用class約束將泛型參數(shù)約束為引用類型
(3)不能將引用/值類型約束與基類約束一起使用,因?yàn)榛惣s束涉及到類
(4)不能使用結(jié)構(gòu)和默認(rèn)構(gòu)造函數(shù)約束,因?yàn)槟J(rèn)構(gòu)造函數(shù)約束也涉及到類
(5)雖然您可以使用類和默認(rèn)構(gòu)造函數(shù)約束,但是這樣做沒(méi)有任何價(jià)值
(6)可以將引用/值類型約束與接口約束組合起來(lái),前提是引用/值類型約束出現(xiàn)在約束列表的開(kāi)頭
新聞熱點(diǎn)
疑難解答
圖片精選