24崖飘、泛型

1. 簡(jiǎn)介:

2.0 版 C# 語(yǔ)言和公共語(yǔ)言運(yùn)行時(shí) (CLR) 中增加了泛型溯街。 泛型將類型參數(shù)的概念引入 .NET Framework,類型參數(shù)使得設(shè)計(jì)如下類和方法成為可能:這些類和方法將一個(gè)或多個(gè)類型的指定推遲到客戶端代碼聲明并實(shí)例化該類或方法的時(shí)候帘瞭。

2. 語(yǔ)法:

    class ClassName<Type>
    {
         public void Add(Type input)
        {
        }
    }

    class Program
    {
        public void test0()
        {
            ClassName<int> testClass = new ClassName<int>();
            testClass.Add(5);
            print<int>(5, 6);
            print(5, 6); // <>可以省略
        }

        public void print<T1>(T1 x, T1 y)
        {
            Console.WriteLine(x.ToString(),y.ToString());
        }

    }

3. 約束:

1> 約束簡(jiǎn)介

在定義泛型類時(shí)淑掌,可以對(duì)客戶端代碼能夠在實(shí)例化類時(shí)用于類型參數(shù)的類型種類施加限制。 如果客戶端代碼嘗試使用某個(gè)約束所不允許的類型來(lái)實(shí)例化類蝶念,則會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤抛腕。 這些限制稱為約束。 約束是使用 where上下文關(guān)鍵字指定的媒殉。 下表列出了六種類型的約束:

約束 說(shuō)明
T : struct 類型參數(shù)必須是值類型担敌。
T : class 類型參數(shù)必須是引用類型;這一點(diǎn)也適用于任何類廷蓉、接口全封、委托或數(shù)組類型。
T:new() 類型參數(shù)必須具有無(wú)參數(shù)的public構(gòu)造函數(shù)桃犬。 當(dāng)與其他約束一起使用時(shí)刹悴,new() 約束必須最后指定。
T:<基類名> 類型參數(shù)必須是指定的基類或派生自指定的基類攒暇。
T:<接口名稱> 類型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口土匀。 可以指定多個(gè)接口約束。 約束接口也可以是泛型的形用。
T:U 為 T 提供的類型參數(shù)必須是為 U 提供的參數(shù)或派生自為 U 提供的參數(shù)就轧。
2> 約束簡(jiǎn)介案例
    class TestClass<TestType> where TestType : struct
    {
            
    }

    static void Main(string[] args)
     {
            TestClass<int> t1 = new TestClass<int>();

            //TestClass<string> t2 = new TestClass<string>(); 錯(cuò)誤,只能傳遞值類型
    }
3> 使用泛型約束的原因(優(yōu)勢(shì))

如果要檢查泛型列表中的某個(gè)項(xiàng)以確定它是否有效尾序,或者將它與其他某個(gè)項(xiàng)進(jìn)行比較钓丰,則編譯器必須在一定程度上保證它需要調(diào)用的運(yùn)算符或方法將受到客戶端代碼可能指定的任何類型參數(shù)的支持。 這種保證是通過(guò)對(duì)泛型類定義應(yīng)用一個(gè)或多個(gè)約束獲得的每币。 例如,基類約束告訴編譯器:僅此類型的對(duì)象或從此類型派生的對(duì)象才可用作類型參數(shù)琢歇。 一旦編譯器有了這個(gè)保證兰怠,它就能夠允許在泛型類中調(diào)用該類型的方法梦鉴。

可以對(duì)同一類型參數(shù)應(yīng)用多個(gè)約束,并且約束自身可以是泛型類型揭保,如下所示:

        class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
        {
            // ...
        }
4> 泛型約束的注意點(diǎn):

通過(guò)約束類型參數(shù)肥橙,可以增加約束類型及其繼承層次結(jié)構(gòu)中的所有類型所支持的允許操作和方法調(diào)用的數(shù)量。 因此秸侣,在設(shè)計(jì)泛型類或方法時(shí)存筏,如果要對(duì)泛型成員執(zhí)行除簡(jiǎn)單賦值之外的任何操作或用 System.Object不支持的任何方法,您將需要對(duì)該類型參數(shù)應(yīng)用約束味榛。在應(yīng)用 where T : class 約束時(shí)椭坚,避免對(duì)類型參數(shù)使用 == 和 != 運(yùn)算符,因?yàn)檫@些運(yùn)算符僅測(cè)試引用同一性而不測(cè)試值相等性搏色。

5> 約束多個(gè)參數(shù)

可以對(duì)多個(gè)參數(shù)應(yīng)用約束善茎,并對(duì)一個(gè)參數(shù)應(yīng)用多個(gè)約束,如下面的示例所示

         class Base { }
         class Test<T, U>
            where U : struct
            where T : Base, new()
            { }
6> 未綁定的類型參數(shù)

沒(méi)有約束的類型參數(shù)(如公共類 SampleClass<T>{}中的 T)稱為未綁定的類型參數(shù)频轿。 未綁定的類型參數(shù)具有以下規(guī)則:

  • 不能使用 !=和 == 運(yùn)算符垂涯,因?yàn)闊o(wú)法保證具體類型參數(shù)能支持這些運(yùn)算符。
  • 可以在它們與 System.Object之間來(lái)回轉(zhuǎn)換航邢,或?qū)⑺鼈冿@式轉(zhuǎn)換為任何接口類型耕赘。
  • 可以將它們與 [null] 進(jìn)行比較。 將未綁定的參數(shù)與 null進(jìn)行比較時(shí)膳殷,如果類型參數(shù)為值類型鞠苟,則該比較將始終返回 false。
7> 作為約束的類型參數(shù)

將泛型類型參數(shù)作為約束使用秽之,在具有自己類型參數(shù)的成員函數(shù)必須將該參數(shù)約束為包含類型的類型參數(shù)時(shí)非常有用当娱,如下示例所示:

        class List<T>
        {
            void Add<U>(List<U> items) where U : T {/*...*/}
        }

在上面的示例中,T在 Add方法的上下文中是一個(gè)類型約束考榨,而在 List 類的上下文中是一個(gè)未綁定的類型參數(shù)跨细。

類型參數(shù)還可在泛型類定義中用作約束。 請(qǐng)注意河质,必須在尖括號(hào)中聲明此類型參數(shù)與任何其他類型的參數(shù):

SampleClass<T, U, V> where T : V { }
8> 為泛型方法添加約束
        void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
        {
            T temp;
            if (lhs.CompareTo(rhs) > 0)
            {
                temp = lhs;
                lhs = rhs;
                rhs = temp;
            }
        }

泛型方法可以使用許多類型參數(shù)進(jìn)行重載冀惭。 例如,下列方法可以全部位于同一個(gè)類中:

        void DoWork() { }
        void DoWork<T>() { }
        void DoWork<T, U>() { }

4. 泛型接口:

語(yǔ)法:

     interface ITest1<K> 
    {

    }

一個(gè)接口可定義多個(gè)類型參數(shù)掀鹅,如下所示:

     interface ITest1<K, V> 
    {

    }

適用于類的繼承規(guī)則同樣適用于接口:

     interface ITest1<S> 
    {

    }

    interface ITest2<K> : ITest1<K>
    {
         
    }

泛型接口的約束:

    interface ITest1<S> where S : class
    {

    }

泛型接口的約束繼承

     interface ITest1<S> where S : class
    {
        
    }

    interface ITest2<K> : ITest1<K> where K : class
    {
         
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末散休,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乐尊,更是在濱河造成了極大的恐慌戚丸,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扔嵌,死亡現(xiàn)場(chǎng)離奇詭異限府,居然都是意外死亡夺颤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門胁勺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)世澜,“玉大人,你說(shuō)我怎么就攤上這事署穗×攘眩” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵案疲,是天一觀的道長(zhǎng)封恰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)络拌,這世上最難降的妖魔是什么俭驮? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮春贸,結(jié)果婚禮上混萝,老公的妹妹穿的比我還像新娘。我一直安慰自己萍恕,他們只是感情好逸嘀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著允粤,像睡著了一般崭倘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上类垫,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天司光,我揣著相機(jī)與錄音,去河邊找鬼悉患。 笑死残家,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的售躁。 我是一名探鬼主播坞淮,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陪捷!你這毒婦竟也來(lái)了回窘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤市袖,失蹤者是張志新(化名)和其女友劉穎啡直,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡付枫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年烹玉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驰怎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阐滩。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖县忌,靈堂內(nèi)的尸體忽然破棺而出掂榔,到底是詐尸還是另有隱情,我是刑警寧澤症杏,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布装获,位于F島的核電站,受9級(jí)特大地震影響厉颤,放射性物質(zhì)發(fā)生泄漏穴豫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一逼友、第九天 我趴在偏房一處隱蔽的房頂上張望精肃。 院中可真熱鬧,春花似錦帜乞、人聲如沸司抱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)习柠。三九已至,卻和暖如春照棋,著一層夾襖步出監(jiān)牢的瞬間资溃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工烈炭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留溶锭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓梳庆,卻偏偏與公主長(zhǎng)得像暖途,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膏执,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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