1. 程式人生 > >c# 之泛型

c# 之泛型

        什麼是泛型:泛型就是通過引數化型別來實現在同一份程式碼上操作多種資料型別,利用“引數化型別”將型別抽象化,從而實現靈活的複用。

       使用泛型給程式碼帶來的5點好處:1、可以最大限度的重用程式碼、保護型別的安全以及提高效能。

                 2、可以建立集合類。

                 3、可以建立自己的泛型介面、泛型方法、泛型類、泛型事件和泛型委託。

                 4、可以對泛型類進行約束,以訪問特定資料型別的方法。

                 5、關於泛型資料型別中使用的型別的資訊,可在執行時通過反射獲取。

  • 泛型的語法:泛型主要有泛型方法(例如:static void Swap<T>(ref T lhs, ref T rhs)),泛型介面( 例如: public interface IEnumerable<out T> : IEnumerable),泛型委託( 例如: public delegate void Action<in T>(T obj);)
  • 常見的泛型型別
    在泛型型別的定義中,出現的每個T(一個展位變數而已叫別的名字也行)在執行時都會被替換成實際的型別引數。下面是一些基礎的泛型型別
    1.泛型類

    class MyGenericClass<T>
    {
    //......
    }
    2.泛型介面

    interface GenericInterface<T>
    {
    void GenericMethod(T t);
    }
    3.泛型方法

    public void MyGenericMethod<T>()
    {
    //......
    }
    4.泛型陣列
    public T[] GenericArray;
    5.泛型委託
    public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input);
    6.泛型結構

    struct MyGenericStruct<T>
    {

    }

  • 泛型型別引數約束
    為什麼要使用型別引數的約束呢,簡單點說就是篩選型別引數,在使用泛型的程式碼中如果違反了某個約束不允許的型別來例項化則會產生編譯錯誤,型別引數的約束是使用關鍵字where。
    下面列出了6中型別的約束
    1、where T: struct
    型別引數必須是值型別。可以指定除 Nullable 以外的任何值型別。有關更多資訊,請參見使用可以為 null 的型別(C# 程式設計指南)。
    2、where T : class
    型別引數必須是引用型別;這一點也適用於任何類、介面、委託或陣列型別。
    3、where T:new()
    型別引數必須具有無引數的公共建構函式。當與其他約束一起使用時,new() 約束必須最後指定。
    4、where T:<基類名>
    型別引數必須是指定的基類或派生自指定的基類。
    5、where T:<介面名稱>
    型別引數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。
    6、where T:U
    為 T 提供的型別引數必須是為 U 提供的引數或派生自為 U 提供的引數。