C#泛型基礎

來源:互聯網
上載者:User

標籤:

  1. 泛型是C#2.0中新加入的特性,它增強了效能,使代碼更富有表現力,提供了更好的通用化方案,在早期的C#版本中通用化是通過類型與通用基底類型Object之間進行強制轉換來實現的,泛型針對這種限制提供瞭解決方案,而且更它將大量的安全檢查從執行時轉移到了編譯時間進行.C#中可以建立自己的泛型介面,泛型類,泛型方法,泛型事件和泛型委派,但不存在泛型的屬性,索引器,操作符,建構函式和析構器。
  2. 型別參數的約束
  3. 約束 說明

    T:Struct

    型別參數必須是實值型別。可以指定除 Nullable 以外的任何實值型別。有關更多資訊,請參見使用可空類型(C# 編程指南)。

    T:Class

    型別參數必須是參考型別,包括任何類、介面、委託或數群組類型。

    T:new()

    型別參數必須具有無參數的公用建構函式。當與其他約束一起使用時,new() 約束必須最後指定。

    T:基類名

    型別參數必須是指定的基類或派生自指定的基類。

    T:介面名稱

    型別參數必須是指定的介面或實現指定的介面。可以指定多個介面約束。約束介面也可以是泛型的。

    T:U

    為 T 提供的型別參數必須是為 U 提供的參數或派生自為 U 提供的參數。這稱為裸類型約束。

  4. 泛型型別是可以重載的,如MyType,Mytype<T>,MyType<T,U>,這些都是不同的類型,他們之間不能相互轉換,這一點對泛型方法也是成立的,
    //在同一個類中void DoWork() { }void DoWork<T>() { }void DoWork<T, U>() { }
    泛型類的建構函式沒有角括弧,
    Dictionary泛型類public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback    {        public Dictionary();            public Dictionary(IDictionary<TKey, TValue> dictionary);               public Dictionary(IEqualityComparer<TKey> comparer);               public Dictionary(int capacity);               public Dictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer);               public Dictionary(int capacity, IEqualityComparer<TKey> comparer);              protected Dictionary(SerializationInfo info, StreamingContext context);               。。。。。。}
  5. 泛型方法類型實參的類型推斷:類型推斷只適用於泛型方法,不適用於泛型型別,
    static List<T> MakeList<T>(T first,T second)。。。List<string>list  = MakeList<string>("tom","Jerry");//使用類型推導可以寫成List<string>list=MakeList("tom","Jerry")
    對於泛型類可以在類中定義一個泛型方法實作類別型推導
    public seale class Pair<T1,T2>:IEquatable<Pair<T1,T2>>{ 。。。public static Pair<T1,T2>Of<T1,T2>(T1 first,T2 second){return new Pair<T1,T2>(first,second);}}
  6. 泛型中的協變性,逆變性和不變性:
    • 協變性:泛型型別參數可以從衍生類別轉換為基類,這種變化時和諧的。通常對於委託,協變型別參數可用作委託的傳回型別,對於介面,協變型別參數可以用作介面的方法的傳回型別。支援協變性的介面有IEnumerable<T>,IEnumerator<T>,IQueryable<T>,IGrouping<TKey,TElement>
    • 逆變性:泛型型別參數可以從基類隱式轉換為衍生類別。通常對於委託,逆變參數可用作參數類型,對於介面逆變型別參數可用作介面方法的參數類型,支援逆變性的介面有IComparer<T>,IComparable<T>和IEqualityComparer<T>
    • 不變性:表示泛型型別參數既不是協變類型也不是逆變類型,只能使用指定的固定類型
  7. C#4.0能夠使用out修飾符來指定型別參數的協變性,使用in修飾型別參數的逆變性
  8. CLR中可變性要注意的問題:
    • 在 .NET Framework 4中,可變性型別參數僅限於泛型介面和泛型委派類型。
    • 泛型介面或泛型委派類型可以同時具有協變和逆變型別參數。
    • 可變性僅適用於參考型別;如果為 可變性型別參數指定實值型別,則該型別參數對於產生的構造類型是不變的。
    • 可變性不適用於委託組合。 也就是說,在給定類型 Action<Derived> 和 Action<Base>的兩個委託的情況下,無法將第二個委託與第一個委託結合起來,儘管結果將是型別安全的。 可變性允許將第二個委託分配給類型 Action<Derived> 的變數,但只能在這兩個委託的類型完全符合的情況下對它們進行組合。

C#泛型基礎

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.