泛型(一)

風靈使發表於2019-01-11

泛型(C# 程式設計指南)

C# 語言和公共語言執行時 (CLR) 的 2.0 版本中新增了泛型。 泛型將型別引數的概念引入 .NET Framework,這樣就可以設計具有以下特徵的類和方法:在客戶端程式碼宣告並初始化這些類和方法之前,這些類和方法會延遲指定一個或多個型別。 例如,通過使用泛型型別引數 T,可以編寫其他客戶端程式碼能夠使用的單個類,而不會產生執行時轉換或裝箱操作的成本或風險,如下所示:

// 宣告泛型類
public class GenericList<T>
{
    public void Add(T input) { }
}
class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // 宣告int型別的列表
        GenericList<int> list1 = new GenericList<int>();
        list1.Add(1);

        // 宣告型別字串列表
        GenericList<string> list2 = new GenericList<string>();
        list2.Add("");

        // 宣告一個ExampleClass型別的列表
        GenericList<ExampleClass> list3 = new GenericList<ExampleClass>();
        list3.Add(new ExampleClass());
    }
}

泛型概述

  • 使用泛型型別可以最大限度地重用程式碼、保護型別安全性以及提高效能。
  • 泛型最常見的用途是建立集合類。
  • .NET Framework 類庫在 System.Collections.Generic 名稱空間中包含幾個新的泛型集合類。應儘可能使用這些類來代替某些類,如 System.Collections 名稱空間中的 ArrayList
  • 可以建立自己的泛型介面、泛型類、泛型方法、泛型事件和泛型委託。
  • 可以對泛型類進行約束以訪問特定資料型別的方法。
  • 在泛型資料型別中所用型別的資訊可在執行時通過使用反射來獲取。

泛型介紹(C# 程式設計指南)

泛型類和泛型方法兼具可重用性、型別安全性和效率,這是非泛型類和非泛型方法無法實現的。 泛型通常與集合以及作用於集合的方法一起使用。 .NET Framework 2.0 版類庫提供新的名稱空間 System.Collections.Generic,其中包含幾個新的基於泛型的集合類。 建議所有定目標到 .NET Framework 2.0 及更高版本的應用程式都使用新增的泛型集合類,而不是舊的非泛型集合類(如 ArrayList)。 有關詳細資訊,請參閱 .NET 中的泛型。

當然,也可以建立自定義泛型型別和泛型方法,以提供自己的通用解決方案,設計型別安全的高效模式。 以下程式碼示例演示了出於演示目的的簡單泛型連結列表類。 (大多數情況下,應使用 .NET Framework 類庫提供的 List<T> 類,而不是自行建立類。)在通常使用具體型別來指示列表中所儲存項的型別的情況下,可使用型別引數 T。 其使用方法如下:

  • AddHead 方法中作為方法引數的型別。
  • Node 巢狀類中作為 Data 屬性的返回型別。
  • 在巢狀類中作為私有成員 data 的型別。

請注意,T 可用於 Node 巢狀類。 如果使用具體型別例項化 GenericList<T>(例如,作為 GenericList<int>),則出現的所有 T 都將替換為 int

// 在尖括號中輸入引數T.
public class GenericList<T> 
{
    // 巢狀類在T上也是通用的.
    private class Node
    {
        //T用於非泛型建構函式
        public Node(T t)
        {
            next = null;
            data = t;
        }

        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }
        
        // T作為私有成員資料型別
        private T data;

        // T作為返回型別的屬性
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }

    private Node head;
    
    // 建構函式
    public GenericList() 
    {
        head = null;
    }

    //T作為方法引數型別:
    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是型別引數
        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");
    }
}

相關文章