C# 泛型

泛型的定義

  • 聲明類和方法的時(shí)候箩退,一般需要定義是什么類扯再,Class Dog,Class Cat等芍耘。當(dāng)針對(duì)不同類型,具有相同行為的時(shí)候熄阻,也就是方法可能是一樣的時(shí)候斋竞,那么泛型就發(fā)揮作用了。

泛型的優(yōu)點(diǎn)

  • 使用泛型類秃殉、方法坝初,我們可以極大地提高代碼的重用性,不需要對(duì)類型不同钾军,代碼相同(僅參數(shù)不同)的代碼寫(xiě)多次
  • 創(chuàng)建泛型類鳄袍,可在編譯時(shí)創(chuàng)建類型安全的集合
  • 避免裝箱和拆箱操作,降低性能吏恭,在大型集合中裝箱和拆箱對(duì)性能的影響很大拗小。(裝箱:值類型轉(zhuǎn)成引用類型;拆箱:引用類型轉(zhuǎn)成值類型)

泛型的種類

  • 在C#代碼中樱哼,在方法名后面使用<T>類型化的參數(shù)哀九,表示這是一個(gè)泛型方法,然后又在圓括號(hào)中使用了類型T搅幅,定義了類型T的參數(shù)變量t阅束,例:

        public void GenericMethod<T>(T t);//泛型方法

        public GenericClass<T>;//泛型類

        public interface IGenericInterface<T> //泛型接口
        {
            void DoSomthing(T t);

        }

        public T[] GenericArray; //泛型數(shù)組


        public delegate TOutput GenericDelagete<TInput, TOutput>(TInput input); //泛型委托

泛型方法使用舉例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TClassDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var stuent = new Student();
            stuent.Show(1);
            stuent.Show("hello,world!");
            Console.ReadKey();

        }

        public class Student
        {
            public void Show<T>(T t)
            {
                Console.WriteLine("The type is "+ t.GetType() +" Value is"+ t);
            }
            
        }


    }
}

輸出結(jié)果

在這里插入圖片描述

使用泛型方法的注意點(diǎn):

  • 確定類型參數(shù),且在方法內(nèi)部處理時(shí)茄唐,要符合類型息裸,否則會(huì)出現(xiàn)類型錯(cuò)誤的情況
  • 調(diào)用時(shí),可根據(jù)定義功能要求傳入具體的類型和實(shí)參值
  • 泛型方法靈活性強(qiáng),但并不是所有方法都要使用泛型的呼盆,要根據(jù)實(shí)際情況來(lái)選擇

泛型類的使用

  • 泛型類:常用于API通用接口的泛型類年扩,代碼摘自代碼
    class Program
    {
        static void Main(string[] args)
        {
            List<Product> data = new List<Client.Product>() {
                              new Client.Product() { Id=12,Name="土豆"},
                              new Client.Product() { Id=12,Name="茄子"},
                              new Client.Product() { Id=12,Name="黃瓜"}
           };
           var resultProduct = Result<Product>.Success(data);
            var resultUser = Result<User>.Error("沒(méi)有數(shù)據(jù)");
            foreach (var item in resultProduct.Data)
            {
                Console.WriteLine(item.Id+","+item.Name);
            }
            Console.WriteLine(resultUser.IsSuccess+resultUser.Message);
        }

    }
    public class Result<T> { //泛型類,聲明T變量類型
        public bool IsSuccess { get; set; }
        public List<T> Data { get; set;}//未定義具體類型的泛型集合
        public string Message { get; set; }
        public static Result<T> Error(string message) 
        {
            return new Client.Result<T> { IsSuccess = false, Message = message };
        }
        //泛型方法宿亡,初始化數(shù)據(jù)
        public static Result<T> Success(List<T> data)
        {
            return new Client.Result<T> { IsSuccess =true,Data =data}; //成功就沒(méi)有提示消息的原則
        }
    }
    public class Product {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    public class User {
        public int Age { get; set; }
        public string Name { get; set; }
    }

泛型集合和ArrayList

  • 看到CSDN上面一個(gè)大牛說(shuō)的常遂,覺(jué)得很有道理,整理如下:
    System.Collections.ArrayList list1 = new System.Collections.ArrayList();
            list1.Add(3);
            list1.Add(105);

            System.Collections.ArrayList list2 = new System.Collections.ArrayList();
            list2.Add("科比");
            list2.Add("詹姆斯");

  • ArrayList是一個(gè)極為方便的集合類挽荠,可以用于存儲(chǔ)任何引用或值類型克胳。但是缺點(diǎn)也很明顯,第一個(gè)缺點(diǎn)是編譯的時(shí)候不會(huì)檢查類型圈匆,例如:
  System.Collections.ArrayList list1 = new System.Collections.ArrayList();
            list1.Add(3);
            list1.Add(105);
            list1.Add("sd");
            foreach (int item in list1)
            {
                Console.WriteLine(item.ToString());
            }

  • 編譯正常漠另,運(yùn)行的時(shí)候會(huì)出現(xiàn)轉(zhuǎn)換類型錯(cuò)誤。至于ArrayList第二個(gè)缺點(diǎn)就是裝箱拆箱的時(shí)候回造成性能的損失跃赚。我們看看ArrayList的Add方法的定義笆搓。


    在這里插入圖片描述
  • 參數(shù)是一個(gè)object類型,也就是說(shuō)ArrayList添加任何引用類型或值類型都會(huì)隱士轉(zhuǎn)換成Object纬傲,這個(gè)時(shí)候便發(fā)生裝箱操作满败,在遍歷檢索它們時(shí)必須從object 類型轉(zhuǎn)換成指定的類型,這個(gè)時(shí)候便發(fā)生拆箱操作叹括。這兩種操作會(huì)大大降低性能算墨。所以.net 2.0的程序時(shí)應(yīng)該放棄使用ArrayList,推薦使用使用List《T》 泛型集合汁雷。這也是我們?yōu)槭裁匆褂梅盒偷脑蛑弧?/li>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末净嘀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子侠讯,更是在濱河造成了極大的恐慌挖藏,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厢漩,死亡現(xiàn)場(chǎng)離奇詭異膜眠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)溜嗜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)宵膨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人粱胜,你說(shuō)我怎么就攤上這事『鳎” “怎么了焙压?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我涯曲,道長(zhǎng)野哭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任幻件,我火速辦了婚禮拨黔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绰沥。我一直安慰自己篱蝇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布徽曲。 她就那樣靜靜地躺著零截,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秃臣。 梳的紋絲不亂的頭發(fā)上涧衙,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音奥此,去河邊找鬼弧哎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛稚虎,可吹牛的內(nèi)容都是我干的撤嫩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼祥绞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼非洲!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蜕径,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤两踏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后兜喻,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體梦染,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年朴皆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了帕识。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遂铡,死狀恐怖肮疗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扒接,我是刑警寧澤伪货,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布们衙,位于F島的核電站,受9級(jí)特大地震影響碱呼,放射性物質(zhì)發(fā)生泄漏蒙挑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一愚臀、第九天 我趴在偏房一處隱蔽的房頂上張望忆蚀。 院中可真熱鬧,春花似錦姑裂、人聲如沸馋袜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桃焕。三九已至,卻和暖如春捧毛,著一層夾襖步出監(jiān)牢的瞬間观堂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工呀忧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留师痕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓而账,卻偏偏與公主長(zhǎng)得像胰坟,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泞辐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • C# 泛型(Generics) 泛型概述 泛型是C#編程語(yǔ)言的一部分笔横,它與程序集中的IL(Intermediate...
    OctOcean閱讀 2,243評(píng)論 0 4
  • 什么是泛型 我們?cè)诰帉?xiě)程序時(shí),經(jīng)常遇到兩個(gè)模塊的功能非常相似咐吼,只是一個(gè)是處理int數(shù)據(jù)吹缔,另一個(gè)是處理stri...
    北風(fēng)知我意閱讀 750評(píng)論 0 4
  • 什么是泛型 我們?cè)诰帉?xiě)程序時(shí),經(jīng)常遇到兩個(gè)模塊的功能非常相似锯茄,只是一個(gè)是處理int數(shù)據(jù)厢塘,另一個(gè)是處理string數(shù)...
    func_老衲姓羅閱讀 254評(píng)論 0 1
  • 我們?cè)诰帉?xiě)程序時(shí),經(jīng)常遇到兩個(gè)模塊的功能非常相似肌幽,只是一個(gè)是處理int數(shù)據(jù)晚碾,另一個(gè)是處理string數(shù)據(jù),或者其他...
    _橙癮閱讀 703評(píng)論 0 1
  • 最近狀態(tài)有點(diǎn)不對(duì)喂急,所以就沒(méi)有去更新筆記格嘁,塔防游戲也沒(méi)繼續(xù)開(kāi)發(fā),等調(diào)整好狀態(tài)再繼續(xù)塔防游戲廊移。先做一些筆記找找感覺(jué)糕簿,估...
    一個(gè)有味道的名字閱讀 1,352評(píng)論 0 2