泛型與非泛型的區別。

                        泛型集合

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
總結(泛型的優勢與特性):編程

性能高,類型安全,二進制代碼重用,代碼的擴展。安全

默認值,繼承,約束,靜態成員。函數

相關文章
相關標籤/搜索