泛型集合lisit<>優點1.性能高 對值類型使用非泛型集合類,在把值類型轉換為引用類型,和把引用類型轉換為值類型時,需要進行裝箱和拆箱的操作。裝箱和拆箱的操作很容易實現,但是性能損失較大, 假如使用泛型,就可以避免裝箱和拆箱操作。 此為集合。 ArrayList list=new ArrayLis ...
泛型集合
lisit<>
優點
1.性能高
對值類型使用非泛型集合類,在把值類型轉換為引用類型,和把引用類型轉換為值類型時,需要進行裝箱和拆箱的操作。裝箱和拆箱的操作很容易實現,但是性能損失較大, 假如使用泛型,就可以避免裝箱和拆箱操作。
此為集合。
ArrayList list=new ArrayList();
list.Add(20); //裝箱,list存放的是object類型元素,須將值類型轉化為引用類型
int i=(int)list[0]; //拆箱,list[0]的類型是object,要賦值就得把引用類型轉化為值類型
此為泛型集合。
List<T> list=new List<int>();
list.Add(20); //因為指定了用int來實例化,因此不必裝箱
int i=list[0]; //同樣地,訪問時也不需要拆箱
2.類型安全。
與Arraylist類一樣,如果使用對象,可以在這個集合中添加任意類型。如果使用非泛型編程,如下代碼,就有可能在某些情況下會發生異常。
非泛型集合。
ArrayList list=new ArrayList();
list.Add(20);
list.Add("string");
list.Add(new MyClass());
foreach(int i in list)
{
Console.WriteLine(i); //這裡會有個異常,因為並不是集合中的所有元素都可以轉化為int
}
如果使用泛型編程,則可以避免這種異常,讓編譯器檢查出錯誤。
List<int> list=new List<int>();
list.Add(20);
lsit.Add("string"); //編譯時報錯,只能報整數類型添加到集合中
list.Add(new MyClass()); //同上
3.二進位代碼重用。
泛型可以定義一次,用許多種不同的類型實例化,泛型可以在一種語言中定義,在另一種.NET語言中使用。
4.代碼的擴展。
因為泛型類的定義會放在程式集中,值類型包含在實例化的泛型類的記憶體中。而每個值類型對記憶體的要求都不同,所以要為每個值類型實例化一個新類。
二.特性
1.預設值。
在給類型T初始化時,要註意不能把null賦予泛型類型。因為泛型類型也可以實例化為值類型,而null只能用於引用類型。為瞭解決這個問題,可以用default關鍵字。通過default關鍵字,將null賦予引用類型,將0賦予值類型。
public T GetDoucumet()
{
T doc=default(T);
lock(this)
{
doc=documentQueue.Dequeue();
}
return doc;
}
2.約束。
如果泛型類需要調用泛型類型上的方法,就必須添加約束。 註意:使用泛型類型還可以合併多個約束。where T:IFoo,new()約束和MyClass<T>聲明指定,類型T必須執行IFoo介面,且必須有一個預設構造函數。
3.繼承。
泛型類型可以執行泛型介面,也可以派生於一個類。泛型類可以派生於泛型基類:
public class Base<T>
{}
public class Derived<T>:Base<string>
{}
要求必須重覆介面的泛型類型,或者必須指定基類的類型。
所以,派生類可以是泛型類或非泛型類。如可以定義一個抽象的泛型基類,它在派生類中用一個具體的類型實現。
4.靜態成員。
泛型類的靜態成員需要特別關註。泛型類的靜態成員只能在類的一個實例中共用。
public class StaticDemo<T>
{
public static int x;
}
對一個string類型和一個int類型使用了StaticDemo<T>類,所以存在兩組靜態欄位:
StaticDemo<string>.x=4;
StaticDemo<int>.x=5;
Console.WrileLine(StaticDemo<string>.x); //將會輸出4
總結(泛型的優點與特性):
性能高,類型安全,二進位代碼重用,代碼的擴展。
預設值,繼承,約束,靜態成員。