泛型與非泛型的區別。


                        泛型集合

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM