C#2.0 泛型詳解

來源:互聯網
上載者:User
泛型是 C#2.0 語言和公用語言運行庫 (CLR) 中的一個新功能。泛型將型別參數的概念引入 .NET Framework,型別參數使得設計如下類和方法成為可能:這些類和方法將一個或多個類型的指定延遲到用戶端代碼聲明並執行個體化該類或方法的時候。例如, 通過使用泛型型別參數 T,可以編寫其他用戶端代碼能夠使用的單個類,而不致引入運行時強制轉換或裝箱操作.
使用泛型型別可以最大限度地重用代碼、保護類型的安全以及提高效能。
泛型最常見的用途是建立集合類。
   .NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。應儘可能地使用這些類來代替普通的類,如 System.Collections 命名空間中的 ArrayList,HashTable等。
非泛型類(System.Collections) 對應的泛型類(System.Collections.Generic)
ArrayList List
Hashtable Dictionary
Queue Queue
Stack Stack
SortedList SortedList

使用泛型的建議:

1.如果需要對多種類型進行相同的操作處理,則應該使用泛型。

2。如果需要處理實值型別,則使用泛型可以避免裝箱拆箱帶來的效能開銷。

3.使用泛型可以在應用程式編譯時間發現類型錯誤,增強程式的健壯性。

4.減少不必要的重複編碼,使代碼結構更加清晰。

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用List<T>替換ArrayList
            List<string> ls = new List<string>();
            ls.Add("泛型集合元素1");
            ls.Add("泛型集合元素2");
            ls.Add("泛型集合元素3");
            foreach (string s in ls)
                Console.WriteLine(s);

        //使用Dictionary<Tkey,Tvalue>
            Console.WriteLine("Dictinary泛型集合類舉例");
            Dictionary<string, string> dct = new Dictionary<string, string>();
            dct.Add("鍵1", "值1");
            dct.Add("鍵2", "值2");
            dct.Add("鍵3", "值3");
            foreach (KeyValuePair<string, string> kvp in dct)
                Console.WriteLine("{0}:{1}", kvp.Key, kvp.Value);
           
            //使用Queue<T>
            Console.WriteLine("Queue泛型集合類型:");
            Queue<string> que = new Queue<string>();
            que.Enqueue("這是隊列元素值1");
            que.Enqueue("這是隊列元素值2");
            foreach (string s in que)
                Console.WriteLine(s);

            //使用Stack<T>
            Console.WriteLine("Stack泛型集合類舉例");
            Stack<string> stack = new Stack<string>();
            stack.Push("這是堆棧元素1");
            stack.Push("這是堆棧元素2");
            foreach (string s in stack)
                Console.WriteLine(s);

            //使用SortedList<Tkey,Tvalue>
            Console.WriteLine("SortedList泛型集合舉例");
            SortedList<string, string> sl = new SortedList<string, string>();
            sl.Add("key1", "value1");
            sl.Add("key2", "value2");
            sl.Add("key3", "value3");
            sl.Add("key4", "value4");
            foreach (KeyValuePair<string, string> kvp in sl)
                Console.WriteLine("{0}:{1}", kvp.Key, kvp.Value);

            Console.ReadLine();
        }
       
    }
}

下面我們就來說下,幾個泛型集合類的用法:

一.Dictionary
此類在 .NET Framework 2.0 版中是新增的。表示鍵和值的集合。命名空間:System.Collections.Generic,程式集:mscorlib(在 mscorlib.dll 中)
    class TestGenericList
    {
         static void Main()
        {
//聲明對象,參數表示,鍵是int類型,值是string類型
            Dictionary<int, string> fruit = new Dictionary<int, string>();
            try{
            //加入重複鍵會引發異常
                fruit.Add(1, "蘋果");
                fruit.Add(2, "桔子");
                fruit.Add(3, "香蕉");
                fruit.Add(4, "菠蘿");            
   //參數錯誤將引發異常,如下所示
   //fruit.Add("5", "aa");
            }
            catch (ArgumentException)
            {
                Console.WriteLine("添加錯誤!!!");
            }
//因為引入了泛型,所以鍵取出後不需要進行Object到int的轉換,值的集合也一樣
            foreach (int i in fruit.Keys)
            {
                Console.WriteLine("鍵是:{0} 值是:{1}",i,fruit);
            }
      //刪除指定鍵,值
            fruit.Remove(1);
             //判斷是否包含指定鍵
            if (fruit.ContainsKey(1))
            {
                Console.WriteLine("包含此鍵");
            }
            //清除集合中所有對象
            fruit.Clear();
        }
    }
Dictionary遍曆輸出的順序,就是加入的順序,這點與Hashtable不同,其它方法如:ContainsKey ,ContainsValue ,Remove 等,使用方法基本一致。

二、List類
注 意:此類在 .NET Framework 2.0 版中是新增的。表示可通過索引訪問的對象的強型別列表。提供用於對列表進行搜尋、排序和操作的方法。命名空 間:System.Collections.Generic,程式集:mscorlib(在 mscorlib.dll 中),List 類是 ArrayList 類的泛型等效類。

   //聲明一個泛型類  
    class TestGenericList
    {
        static void Main()
        {
            //聲明一個List對象,只加入string參數
            List<string> names = new List<string>();
            names.Add("喬峰");
            names.Add("歐陽峰");
            names.Add("馬蜂");
            //遍曆List
            foreach (string name in names)
            {
                Console.WriteLine(name);
            }
            //向List中插入元素
            names.Insert(2, "張三峰");
            //移除指定元素
            names.Remove("馬蜂");           
        }
    }
在 決定使用 List 還是使用 ArrayList 類(兩者具有類似的功能)時,記住 List 類在大多數情況下執行得更好並且是型別安全的。如果對 List 類的類型 T 使用參考型別,則兩個類的行為是完全相同的。但是,如果對類型 T 使用實值型別,則需要考慮實現和裝箱問題。

如果對類型 T 使用實值型別,則編譯器將特別針對該實值型別產生 List 類的實現。這意味著不必對 List 對象的列表元素進行裝箱就可以使用該元素,並且在建立大約 500 個列表元素之後,不對列表元素裝箱所節省的記憶體將大於產生該類實現所使用的記憶體。

其實我們也可以自己定義一個泛型類,如下所示:
   //聲明一個泛型類
    public class ItemList<T>
    {
        void Add(T item) { }
    }
    class TestGenericList
    {
        private class ExampleClass { }
        static void Main()
        {
            // 聲明一個對象,只能加入int型
            ItemList<int> list1 = new ItemList<int>();

            //聲明一個對象,只能加入Student類型,Student類為自訂類
            ItemList<Student> list2 = new ItemList<Student>();

        }
    }

泛型的用法還有很多種,如泛型方法,泛型委派,泛型介面等。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.