C#提供了一個非常方便的東西——泛型,那么什么是泛型,泛型有哪些好處,如何使用泛型?下面就做一個詳細的介紹:
1、什么是泛型?
通過泛型可以定義類型安全類,而不會損害類型安全、性能或工作效率
2、實例化泛型
(1)可以使用任何類型來聲明和實例化
(2)申明和實例話都必須用一個特定的類型來代替一般類型T
(3)舉例說明:
//原來寫法
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)一次性的開發、測試和部署代碼,通過任何類型來重用它
(2)編譯器支持和類型安全
(3)不會強行對值類型進行裝箱和取消裝箱,或者對引用類型進行向下強制類型轉換,所以性能得到顯著提高。
注:值類型大概可以提高200%,引用類型大概為100%
4、多個泛型
單個類型可以定義多個泛型
5、泛型別名
(1)在文件頭部使用using 為特定類型取別名,別名作用范圍是整個文件
(2)舉例說明
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)//只有實現這個接口才可比較
}
}
注意:
(1)所有的派生約束必須放在類的實際派生列表之后
如:public class LinkedList <K,T> :IEnumerable <T> where K:IComparable <K> {...}
(2)一個泛型參數上可以約束多個接口(用逗號分隔)
public class LinkedList <K,T> where K:IComparable <K> ,IConvertible
(3)在一個約束中最多只能使用一個基類
(4)約束的基類不能是密封類或靜態類
(5)不能將System.Delegate或System.Array約束為基類
(6)可以同時約束一個基類以及一個或多個接口,但是該基類必須首先出現在派生約束列表中。
(7)C#允許你將另一個泛型參數指定為約束
public class MyClass <T,U> where T:U
{...}
(8)可以自己定義基類或接口進行泛型約束
(9)自定義的接口或基類必須與泛型具有一致的可見性
B構造函數約束
如:
class Node <K,T> where T:new()
{
}
注意:
可以將構造函數的約束和派生約束結合起來,前提是構造函數的約束出現在約束列表中的最后
C引用/值類型約束
(1)可以使用struct約束將泛型參數約束為值類型(如int、bool、enum),或任何自定義結構
(2)同樣可以使用class約束將泛型參數約束為引用類型
(3)不能將引用/值類型約束與基類約束一起使用,因為基類約束涉及到類
(4)不能使用結構和默認構造函數約束,因為默認構造函數約束也涉及到類
(5)雖然您可以使用類和默認構造函數約束,但是這樣做沒有任何價值
(6)可以將引用/值類型約束與接口約束組合起來,前提是引用/值類型約束出現在約束列表的開頭
新聞熱點
疑難解答
圖片精選