今天的文章是由於再給一個朋友講這個的時候隨手記錄下整理出來的。說白了就是把前輩們曾經給我吹過的我又吹了出去。設計模式
泛型:是C# FrameWork 2.0 時代 加入進來的,能夠說對與Net開發人員來講泛型是無處再也不的,喜歡看源碼的同窗,可能會有發現,包括MVC裏面基本上也是有不少發泛型,還有不少設計模式也須要搭配泛型來實現,包括項目架構架構
泛型的存在,是代碼利用率複用性都大大的提高了,有時候Object 也是能夠起到相同的做用,爲何使用泛型 爲何不是用Obj ,咱們來看一下:框架
下面咱們列出兩個最基礎的方法:函數
/// <summary> /// 返回int /// </summary> /// <param name="I"></param> /// <returns></returns> public int ShowInt(int I) { return I; } /// <summary> /// 返回String /// </summary> /// <param name="I"></param> /// <returns></returns> public string ShowString (string I) { return I; }
上面的兩個方法自從參數 進來到參數出去的這一個過程當中咱們沒有進行參數方面的轉換,也就是說單純的針對的參數類型上面咱們程序代碼是沒有損失任何的性能的。一位沒有存在拆箱裝箱的過程。性能
咱們在看兩個方法:咱們使用了在C# 1.0 時代就存在的一個類型 是Object
學習
/// <summary> /// 返回int /// </summary> /// <param name="I"></param> /// <returns></returns> public int ShowString(object I) { return Convert.ToInt32(I); } /// <summary> /// 返回String /// </summary> /// <param name="I"></param> /// <returns></returns> public string ShowString(object I) { return I.ToString(); }
這裏咱們使用的闡述類型是Obj ,Object 是引用類型,也是全部類型的父類,能夠包容全部的類型,可是就單說處理參數類型的時候咱們須要去轉換一下才能進行使用,在這個轉換的過程當中咱們已經損失了性能,可是使用Obj 的時候咱們能夠和成一個方法減小代碼量,提高了代碼的複用率。spa
好比:設計
/// <summary> /// 返回object /// </summary> /// <param name="I"></param> /// <returns></returns> public object ShowType(object I) { return I; }
如今簡寫成爲這樣後,咱們是一個公用的方法:雖說內部不用去轉換了可是,在調用後,仍是須要類型的轉換一樣的須要損失性能。中間性能之因此會損失是由於Obj是引用類型,存放在堆上的,假如說咱們傳的參數是int或其餘的值類型來使用咱們的公共方法,就會進行一次包裝的過程,把存放在棧裏面的值類型移動包裝成爲引用類型存放到堆裏面,使參數符合當前方法的類型,這個過成也就是裝箱(須要從新分配內存),可是咱們在使用的時候,又須要把他拿出來進行一下裝換轉換爲值類型,這個過程又稱爲拆箱,code
咱們在來使用一個方法:使用 2.0時代出現的泛型:blog
/// <summary> /// 返回 T /// </summary> /// <param name="Parameter"></param> /// <returns></returns> public T Show<s>(T Parameter) { return Parameter; }
爲何會使用泛型 是由於泛型方法再調用的時候有延時聲明的功能這裏的延時聲明式只參數,泛型裏面的 T ,其實我們也能夠理解爲 佔位符具體爲誰佔位的,等到調用的時候纔會知道。
以下:
int parameter = 0; //在調用的時候聲明參數類型 parameter = new Common().Show<int>(parameter); //若是調用的時候不去聲明的話,JIT編譯的時候野會幫咱們自動計算 parameter = new Common().Show(parameter);
這個時候不會損耗什麼性能。延時聲明也是我們在進行框架設計的時候經常使用的一種思想,提升框架的性能。泛型不僅是能夠聲明泛型方法:
泛型類:
/// <summary> /// CURD 操做類 /// </summary> /// <typeparam name="T"></typeparam> public class ConmonClass<T> { public void Add(T s) { }; public void Update(T s) { }; public void Del(T s) { }; public void Select(T s) { }; }
這樣使用的話,在我們真正的項目,咱們能夠把某些基礎的操做用一個類去搞定,使用的時候調用就是了,減小代碼的冗餘,增長複用性,重用率。
泛型接口:
/// <summary> /// CURD 操做接口類 /// </summary> /// <typeparam name="T"></typeparam> public interface ConmonInterface<T> { T Add(T s); T Update(T s); T Del(T s); T Select(T s); }
泛型委託:
//泛型委託 public delegate T GetHandler<T>();
我想以上的操做在咱們開發項目的時候會常常見到,或使用到
以上代碼須要咱們注意的時候,泛型類不能被繼承,若是想要繼承的話須要在繼承的時候,給咱們的不肯定參數肯定下參數類型。包括泛型接口也是同樣的。
以下:
public class Son : ConmonClass<Common> {}; /// <summary> /// 實現泛型接口 /// </summary> public class SonInterface : ConmonInterface<Common> { public Common Add(Common s) { throw new NotImplementedException(); } public Common Del(Common s) { throw new NotImplementedException(); } public Common Select(Common s) { throw new NotImplementedException(); } public Common Update(Common s) { throw new NotImplementedException(); } }
若是說不指定泛型類型的參數類型式其實咱們同樣是能夠繼承的。需用繼承者一樣是泛型的。
建議:長期使用Net的同窗我想咱們須要增強一下泛型的認識了,由於在NetCore中經常會使用依賴注入,在使用泛型類的時候咱們可能會多少有點麻煩的,泛型方法相對來講要簡單的,若是說要想讓咱們的框架實現高度的內聚,你們須要多多理解。
泛型的約束,多重約束至關重要,表明咱們是否能很好的利用泛型。
泛型的約束類型大概分爲以下幾種:
引用類型約束: |
代表泛型參數只能是引用類型的: |
值類型約束: |
代表泛型參數只能是值類型的: |
無參數構造函數約束: |
泛型是能夠實例化的。 |
基類約束 |
必須知足基類中的某些屬性 |
接口約束 |
必須知足接口中的某些屬性 |
具體的就不代碼了。
有不足之處 但願你們指出相互學習,
本文原創:轉載請註明出處 謝謝!