泛型

泛型類和泛型方法同時具備可重用性、類型安全和效率,這是非泛型類和非泛型方法無法具備的。泛型通常用與集合以及作用於集合的方法一起使用。.NET Framework 2.0 版類庫提供一個新的命名空間 System.Collections.Generic,其中包含幾個新的基於泛型的集合類。建議面向 .NET Framework 2.0 及更高版本的所有應用程序都使用新的泛型集合類,而不要使用舊的非泛型集合類如 ArrayList。有關更多信息,請參見 .NET Framework 類庫中的泛型(C# 編程指南)
當然,也可以創建自定義泛型類型和方法,以提供自己的通用解決方案,設計類型安全的高效模式。下面的代碼示例演示一個用於演示用途的簡單泛型鏈接列表類。(大多數情況下,應使用 .NET Framework 類庫提供的 List<(Of <(T>)>) 類,而不是自行創建類。)在通常使用具體類型來指示列表中存儲的項的類型的場合,可使用類型參數 T。其使用方法如下:
  • AddHead 方法中作爲方法參數的類型。
  • Node 嵌套類中作爲公共方法 GetNextData 屬性的返回類型。
  • 在嵌套類中作爲私有成員數據的類型。
注意,T 可用於 Node 嵌套類。如果使用具體類型實例化 GenericList<T>(例如,作爲 GenericList<T>),則所有的 GenericList<T> 都將被替換爲 int
// type parameter T in angle brackets
public class GenericList<T> 
{
    // The nested class is also generic on T.
    private class Node
    {
        // T used in non-generic constructor.
        public Node(T t)
        {
            next = null;
            data = t;
        }
        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }
        // T as private member data type.
        private T data;
        // T as return type of property.
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }
    private Node head;
    // constructor
    public GenericList() 
    {
        head = null;
    }
    // T as method parameter type:
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }
    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;
        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}
下面的代碼示例演示客戶端代碼如何使用泛型 GenericList<T> 類來創建整數列表。只需更改類型參數,即可方便地修改下面的代碼示例,創建字符串或任何其他自定義類型的列表:
class TestGenericList
{
    static void Main()
    {
        // int is the type argument
        GenericList<int> list = new GenericList<int>();
        for (int x = 0; x < 10; x++)
        {
            list.AddHead(x);
        }
        foreach (int i in list)
        {
            System.Console.Write(i + " ");
        }
        System.Console.WriteLine("\nDone");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章