欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C#泛型-創(chuàng)新互聯(lián)

一、泛型

創(chuàng)新互聯(lián)是專業(yè)的和田縣網(wǎng)站建設(shè)公司,和田縣接單;提供做網(wǎng)站、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行和田縣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

假設(shè)我要寫個(gè)公用的輸出傳入?yún)?shù)的方法(不用泛型),因?yàn)槿f物皆對象的理由,我先定義一個(gè)方法show(object obj),如下面所示:

        public static void Show(object obj)
        {
            Console.WriteLine(obj.ToString());
        }

執(zhí)行這個(gè)方法

            int i = 1;  //裝箱
            Show(i);

如果傳入的是值類型,值類型轉(zhuǎn)換為引用類型,我們知道會(huì)發(fā)生裝箱,這是對性能的損害,想想如果是個(gè)集合,就得多次執(zhí)行裝箱、拆箱操作。如ArrayList類,ArrayList儲(chǔ)存對象,Add()方法定義為需要把一個(gè)對象作為參數(shù),如果傳入的值類型,就得裝箱,在讀取ArrayList中的值時(shí),又得進(jìn)行拆箱,如下面代碼所示:

            var list = new ArrayList();
            list.Add(1); //裝箱

            foreach (int i in list)
            {
                Console.WriteLine(i); //拆箱
            }

如果使用泛型,就不會(huì)出現(xiàn)這樣的問題了,我們使用List<T>類來改造上面代碼:

            var list = new List<int>();
            list.Add(1); 

            foreach (int i in list)
            {
                Console.WriteLine(i); 
            }

這里就不存在裝箱和拆箱了,所以我們在使用集合的時(shí)候,盡量使用泛型集合,不要使用非泛型集合。

二、類型安全

在上面ArrayList類中,添加參數(shù)時(shí),可以添加任何對象,比如上面的例子,如果在添加整數(shù)類型后再添加引用類型,這么做在編譯時(shí)是沒有任何問題,但是在foreach語句使用整數(shù)類型迭代的時(shí)候就會(huì)報(bào)錯(cuò)。

            var list = new ArrayList();
            list.Add(1); //裝箱
            list.Add("string");            foreach (int i in list)
            {
                Console.WriteLine(i);
            }

這時(shí)候就會(huì)報(bào)InvalidCastException的異常。

如果使用泛型集合List<T>的時(shí)候去重寫上面的代碼,在編譯的時(shí)候就會(huì)報(bào)錯(cuò)。所以這個(gè)地方我們就能知道,泛型是在編譯時(shí)就已經(jīng)執(zhí)行了,所以系統(tǒng)運(yùn)行時(shí)我們時(shí)沒有裝箱拆箱的系統(tǒng)開銷,而非泛型是在運(yùn)行時(shí)執(zhí)行的,所以可能導(dǎo)致異常發(fā)生;

三、創(chuàng)建泛型類和泛型方法

泛型方法,從我最先第一個(gè)例子Show(object)  ,采用泛型來重寫,定義為Show<T>(T);

        public static void Show<T>(T obj)
        {
            Console.WriteLine(obj.ToString());
        }

 泛型類,如public class List<T>{}

3.1 命名約定

  •    泛型類型的名稱用字母T作為前綴。

  •    如果沒有特殊的要求,泛型類型運(yùn)行用任意類替代,且只使有一個(gè)泛型類型,就可以用字符T作為泛型類型的名稱。

  •    如果泛型類型有特殊的要求(如它必須實(shí)現(xiàn)一個(gè)接口或派生自基類),或者使用了兩個(gè)或以上的泛型類型,就應(yīng)給泛型類型使用描述性的名稱:

   public delegate void EventHandler<TEventArgs>(object sender,TEventArgs e);

   public delegate TOutput Convert<TInput,TOutput>(TInput input);

   public class SortedList<TKey,TValue>{};

3.2 默認(rèn)值

   在泛型類和泛型方法中產(chǎn)生的一個(gè)問題是,在預(yù)先未知以下情況時(shí),如何將默認(rèn)值分配給參數(shù)化類型 T,給定參數(shù)化類型 T 的一個(gè)變量 t,只有當(dāng) T 為引用類型時(shí),語句 t = null 才有效;只有當(dāng) T 為數(shù)值類型而不是結(jié)構(gòu)時(shí),語句 t = 0 才能正常使用。 解決方案是使用default 關(guān)鍵字,此關(guān)鍵字對于引用類型會(huì)返回 null,對于數(shù)值類型會(huì)返回零。 對于結(jié)構(gòu),此關(guān)鍵字將返回初始化為零或 null 的每個(gè)結(jié)構(gòu)成員。

使用方式如:T obj=default(T);

3.3 約束

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

約束  說明
where T:struct  對于結(jié)構(gòu)的約束,類型T必須是值類型。
where T:class  類的約束,類型T必須是應(yīng)用類型。
where T:<接口名稱>類型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口。 可以指定多個(gè)接口約束。 約束接口也可以是泛型的。
where T:<基類名>類型參數(shù)必須是指定的基類或派生自指定的基類。
where T:new()    類型參數(shù)必須具有無參數(shù)的公共構(gòu)造函數(shù)。 當(dāng)與其他約束一起使用時(shí),new() 約束必須最后指定。
where T1:T2          類型T1必須是類型T2或派生自泛型類型T2,該約束也稱為裸型約束。

    public class MyClass<T> where T : IComparer<T>, new()
    {

    }

上面代碼,使用泛型類型添加了兩個(gè)約束,聲明指定類型T必須實(shí)現(xiàn)了IComparer接口,且必須有一個(gè)默認(rèn)構(gòu)造函數(shù)

    public class MyClass<TOutput, TInput> where TOutput : IComparer<TOutput>, new()        where TInput:class,TOutput
    {

    }

上面代碼用了兩個(gè)泛型類型,TOutput必須實(shí)現(xiàn)了IComparer接口,且必須有一個(gè)默認(rèn)構(gòu)造函數(shù),TInput必須是引用類型,且類型必須是TOutput或派生自TOutput。

3.4 繼承

泛型類型可以實(shí)現(xiàn)泛型接口,也可以派生自一個(gè)類。泛型類型可以派生自泛型基類,其要求必須重復(fù)接口的泛型類型,或者必須指定基類的類型。如下列所示:

    public class BaseClass<T> { }    ///必須重復(fù)接口\基類的泛型類型
    public class MyClass<T> : BaseClass<T> { }
    public class BaseClass<T> { }    ///必須指定基類的類型
    public class MyClass<T> : BaseClass<String> { }

派生類可以是泛型類或非泛型類,例如定義一個(gè)抽象的泛型基類,它在派生類中用一個(gè)具體的類型實(shí)現(xiàn),如下列所示:

    public abstract class Calcu<T>
    {        public abstract T Add(T x, T y);        public abstract T Sub(T x, T y);
    }    /// <summary>
    /// 派生類中具體的類型實(shí)現(xiàn)    /// </summary>
    public class IntCalcu : Calcu<int>
    {        public override int Add(int x, int y)
        {            return x + y;
        }        public override int Sub(int x, int y)
        {            return x - y;
        }
    }

四、結(jié)語

這些泛型類和泛型方法將一個(gè)或多個(gè)類型的指定推遲到客戶端代碼聲明并實(shí)例化該類或方法的時(shí)候。 例如,通過使用泛型類型參數(shù) T,您可以編寫其他客戶端代碼能夠使用的單個(gè)類,而不致引入運(yùn)行時(shí)強(qiáng)制轉(zhuǎn)換或裝箱操作的成本或風(fēng)險(xiǎn)。在架構(gòu)中有句話是讓一切能延遲的延遲。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站欄目:C#泛型-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://chinadenli.net/article10/hpddo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)網(wǎng)站設(shè)計(jì)公司微信公眾號(hào)企業(yè)建站關(guān)鍵詞優(yōu)化響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)