C#泛型

1、泛型Tc#

這個T在實際使用中很常見,好比List<T>。其實咱們還能夠寫成List<object>。可是這樣寫會有一個問題。好比我把一個int數據存入到一個List<object>集合中,int則會被自動轉成object,當咱們試圖取取用這個int數據的時候,咱們還要把object轉成int。這期間有一個轉換,int=》object=》int,這個轉換涉及到拆箱和封箱操做,也就是引用類型到值類型或者值類型到引用過程轉換的過程,這個是很耗時的。當數據量大的時候,這個對於代碼的效率是有不可忽視的影響的。.net

同時,若是不當心把一個string類型存入到了這個List<object>中,系統是不會報錯的。可是當要取用的時候,你也許開始沒發現不當心存入了一個string類型,而後你想固然的認爲它是一個int類型,把它轉成了int,這個時候你的程序就要報錯了。這也是一個問題。blog

這個時候使用List<object>的隱患就顯現出來了。爲了比較好的解決這兩個問題,c#引入了T這個概念,由於在大部分場景下,咱們的類型都是肯定的,不必用object。繼承

當咱們使用List<T>的時候,咱們首先實例化一個List<T>,好比這樣的代碼:接口

List<string> list=new List<string>();編譯器

這個代碼的意思是告訴list這個集合只能放string這個類型的數據,放其餘類型的數據,編譯器是會報錯的。這樣咱們不難理解,T這個東西的做用,其實就是一個通用的容器,製造它的人開始不指定它是用來裝什麼的,而使用者在使用它的時候要告訴這個容器準備用來裝什麼,容器知道了用來裝什麼以後,後面全部存入操做,它都要檢查一下你放的東西是否是開始指定的東西類型。string

2、泛型方法io

如今有一個需求,須要寫一個方法,這個方法傳入的參數多是int型的,也多是string型的。首先咱們能夠用方法的重載方案解決這個問題,好比下面兩個重載方法:編譯

        public void test(int param)
        { }
        public void test(string param)
        { }class

可是這樣的話若是支持的類型變多了,那麼你須要寫不少重載方法。若是隻寫一個重載方法,則能夠寫成

 public void test(object param) { }

可是這樣寫又出現object轉成其餘類型的問題,會帶來效率損失。同時不檢查類型,一旦傳入了不支持的類型,可能會出問題。

如今把test方法改造一下,這樣寫:

 public void test<T>(T param){ }

這樣寫以後,使用的時候要求提早通知這個方法,你傳入的是什麼類型,即:

test<int>(10);

若是寫成 test<int>("10");編譯器就會報錯。

這就是泛型方法。這裏面咱們省略了方法內部的實現,其實仔細想一下,若是要在這樣的方法裏面添加業務代碼,彷佛除了用於存放數據的集合以外,並無多少場景須要這麼寫方法。沒錯,泛型這個東西最經常使用的應用場景就是數據集合。而List<T>就是一個存放各類數據的泛型類。

3、泛型類

上面的方法:public void test<T>(T param){ },咱們能夠嘗試一下把<T>去掉,只寫成public void test(T param){ }看看會發生什麼。你會發現編譯器會報錯,那麼咱們再嘗試一下在這個方法的類名上加上<T>,即寫成:

 class TClass<T>
    {
        public void test(T param)
        { }
    }

你會發現,若是把<T>放到類名上,裏面的方法就不須要加 <T>了,同時編譯器也不會報錯。這是一種比較簡潔的寫法。這個時候,TClass這個類就是泛型類,而它的構造方法,則和普通的類的構造方法的寫法是同樣的。當你要實例化這個類型的時候,必須告訴這個類型T表明哪一個類型,以後,全部這個類裏面被標識了T的地方,都是指你開始實例化指明的類型。好比test這個方法裏面傳入的param,必定要和你開始實例化這個類的時候指明的類型一致。再好比你寫一個返回T的方法: public T returnTest() { },這個方法的返回值也必須是你實例化類時指明的類型。若是咱們TClass改爲List,把test改爲Add,則方法變成了下面這樣

 class List<T>
    {
        public void Add(T param)
        { }
    }

這不就是咱們常常用的List<T>這個泛型集合嗎。固然它的內部實現還有不少東西,這裏咱們不去關注。

4、有了泛型類的概念,泛型接口就很好理解了,給上面的TClass寫一個接口進行規範:

 interface ITClass<T>
    {
        void test(T param);
    }

上面講的TClass繼承這個接口就能夠了:

 class TClass<T> : ITClass<T>    {        public void test(T param)        {            throw new NotImplementedException();        }    }————————————————版權聲明:本文爲CSDN博主「returnTrue999」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。原文連接:https://blog.csdn.net/dap769815768/article/details/81946506

相關文章
相關標籤/搜索