《CLR.via.C#第三版》第二部分第12章節 泛型 讀書筆記(六)

來源:互聯網
上載者:User

標籤:style   blog   io   color   ar   使用   sp   資料   div   

終於講到泛型了。當初看到這個書名,最想看的就是作者對泛型,委託,反射這些概念的理解。很多人對泛型的理解停留在泛型集合上,剛開始我也是,隨著項目越做越多,對待泛型的認識也越來越深刻。

 

泛型的概念:泛型是一種特殊的類型,它把指定類型的工作延遲到用戶端代碼聲明並執行個體化類或方法的時候進行。

泛型的優勢:原始碼保護、型別安全、更加清晰的代碼、更佳的效能。

原理:(關鍵字:開放類型,封閉類型)所有帶泛型參數的類型都是一個開放式類型,它不能被執行個體化(類似介面),在具體使用時產生封閉類型(實際資料類型)。

泛型約束(至多一個主要約束,次要約束無限制):

     泛型約束的使用:

        /// <summary>        /// 未加約束的T可以是任何類型,許多類型沒有提供CompareTo方法,沒有約束將導致代碼不能編譯,報"‘T‘不包含‘CompareTo‘的定義"錯誤        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="o1"></param>        /// <param name="o2"></param>        /// <returns></returns>        private static T Min<T>(T o1,T o2) where T : IComparable<T>        {            if (o1.CompareTo(o2) < 0) return o1;            return o2;        }

      構造器約束:

//因為所有實值型別都隱式有一個公用無參構造器。約束要求指定的任何參考型別也要有一個公用無參構造器internal sealed class ConstructorConstraint<T> where T:new(){      public static T Factory(){          return new T();      }}

      由於泛型型別參數不能指定以下特殊參考型別:System.Object,System.Array,System.Delegate,System.MulticastDelegate,System.ValueType,System.Enum,System.Void,一些實參限制的實現可能要“特殊處理”,如以下使用靜態構造器來保證類型是一個枚舉類型。

internal sealed class GenericTypeThatRequiresAnEnum<T>{    static GenericTypeThatRequiresAnEnum(){        if(!typeof(T).IsEnum){             throw new ArgumentException("T must be an enumerated type");        }    }}

泛型介面的優勢:沒有泛型介面,每次視圖使用一個非泛型介面來操作一個實值型別,都會發生裝箱,而且會失去編譯時間的型別安全。

委託和介面的逆變和協變泛型型別實參:

不變數:意味著泛型型別參數不能更改。(常用)

逆變數:意味著泛型型別參數可以從一個基類更改為該類的衍生類別。在C#中,用in關鍵字標記逆變數形式的泛型型別參數。逆變數泛型型別參數只出現在輸入位置,比如作為方法的參數。

協變數:意味著泛型型別參數可以從一個衍生類別更改為它的基類。在C#中,是用out關鍵字標記協變數形式的泛型型別參數。協變數泛型型別參數只能出現在輸出位置,比如作為方法的傳回型別。

public delegate TResult Func<in T,out TResult>(T arg);

其它重要認知:

類型實參的指定和繼承階層沒有任何關係--理解這一點,有助於你判斷轉型的進行。
C#允許使用簡化的文法來引用一個泛型封閉類型

using DateTimeList = System.Collections.Generic.List<System.DateTime>;

現在執行下面這行代碼時,sameType會被初始化為true:

Boolean sameType = (typeof(List<DateTime>) == typeof(DateTimeList));

CLR支援泛型委派,目的是保證任何類型的對象都能以一種型別安全的方式傳給一個回調方法。此外,泛型委派允許任何一個實值型別執行個體在傳給一個回調方法時不執行任何裝箱處理。

一些驗證問題:

1. 泛型型別變數的轉型

將一個泛型型別的變數轉型為另一個類型是非法的,除非將其轉型為另一個約束相容的類型

private static void CastingType<T>(T obj){     Int32 x = (Int32)obj;//錯誤     String s = (String)obj;//錯誤     string s2 = obj as String;//無錯誤}

2. 設定預設值

private static void SettingDefaultValue<T>(){      T temp = default(T);}

default關鍵字告訴C#編譯器和CLR的JIT編譯器,如果T是一個參考型別,就將temp設為null,如果T是一個實值型別,就將temp的所有位設為0。

《CLR.via.C#第三版》第二部分第12章節 泛型 讀書筆記(六)

聯繫我們

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