C#2.0新增功能02 泛型

  C# 語言和公共語言運行時 (CLR) 的 2.0 版本中添加了泛型。 泛型將類型參數的概念引入 .NET Framework,這樣就能夠設計具備如下特徵的類和方法:在客戶端代碼聲明並初始化這些類和方法以前,這些類和方法會延遲指定一個或多個類型。
泛型定義

  泛型是爲所存儲或使用的一個或多個類型具備佔位符(類型形參)的類、結構、接口和方法。 泛型集合類能夠將類型形參用做其存儲的對象類型的佔位符;類型形參呈現爲其字段的類型和其方法的參數類型。 泛型方法可將其類型形參用做其返回值的類型或用做其形參之一的類型。html

如下代碼舉例說明了一個簡單的泛型類定義。 api

public class Generic<T>
{
    public T Field;
}

建立泛型類的實例時,指定用於替代類型形參的實際類型。 在類型形參出現的每一處位置用選定的類型進行替代,這會創建一個被稱爲構造泛型類的新泛型類。 你將獲得根據你選擇的類型而定製的類型安全類,如如下代碼所示。安全

public static void Main()
{
    Generic<string> g = new Generic<string>();
    g.Field = "A string";
    //...
    Console.WriteLine("Generic.Field           = \"{0}\"", g.Field);
    Console.WriteLine("Generic.Field.GetType() = {0}", g.Field.GetType().FullName);
}

例如,經過使用泛型類型參數 T,能夠編寫其餘客戶端代碼可以使用的單個類,而不會產生運行時轉換或裝箱操做的成本或風險,以下所示:ide

// 定義通用泛型類
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); // 定義 string 類型的集合 GenericList<string> list2 = new GenericList<string>(); list2.Add(""); // 定義 ExampleClass 類類型的集合 GenericList<ExampleClass> list3 = new GenericList<ExampleClass>(); list3.Add(new ExampleClass()); } }

  泛型類和泛型方法兼具可重用性、類型安全性和效率,這是非泛型類和非泛型方法沒法實現的。 泛型一般與集合以及做用於集合的方法一塊兒使用。 .NET Framework 2.0 版類庫提供新的命名空間 System.Collections.Generic,其中包含幾個新的基於泛型的集合類。 建議全部定目標到 .NET Framework 2.0 及更高版本的應用程序都使用新增的泛型集合類,而不是舊的非泛型集合類(如 ArrayList)。 有關詳細信息,請參閱 .NET 中的泛型函數

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

  • AddHead 方法中做爲方法參數的類型。ui

  • Node 嵌套類中做爲 Data 屬性的返回類型。spa

  • 在嵌套類中做爲私有成員 data 的類型。設計

請注意,T 可用於 Node 嵌套類。 若是使用具體類型實例化 GenericList<T>(例如,做爲 GenericList<int>),則出現的全部 T 都將替換爲 intcode

// 泛型 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("\n 完成");
    }
}

泛型主要有兩個優勢:

  • 編譯時能夠保證類型安全。
  • 不用作類型轉換,得到必定的性能提高。

泛型概述

  • 使用泛型類型能夠最大限度地重用代碼、保護類型安全性以及提升性能。

  • 泛型最多見的用途是建立集合類。

  • .NET Framework 類庫在 System.Collections.Generic 命名空間中包含幾個新的泛型集合類。 應儘量使用這些類來代替某些類,如 System.Collections 命名空間中的 ArrayList

  • 能夠建立本身的泛型接口、泛型類、泛型方法、泛型事件和泛型委託。

  • 能夠對泛型類進行約束以訪問特定數據類型的方法。

  • 在泛型數據類型中所用類型的信息可在運行時經過使用反射來獲取。

更多相關信息:

 

相關文章
相關標籤/搜索