真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

.NET中泛型怎么用-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān).NET中泛型怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷(xiāo),提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷(xiāo)、小程序制作、公眾號(hào)商城、等建站開(kāi)發(fā),創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專(zhuān)家,為不同類(lèi)型的客戶(hù)提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶(hù)在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。

從簡(jiǎn)單的例子理解泛型
話說(shuō)有家影視公司選拔偶像派男主角,導(dǎo)演說(shuō)了,男演員,身高是王道。于是有下面代碼:



//男演員實(shí)體類(lèi)
public class Boy
{
    //姓名
    private string mName;
    //身高
    private int mHeight;
    public string Name {
        get { return this.mName; }
    }
    public int Height {
        get { return this.mHeight; }
    }

    public Boy(string name, int height) {
        this.mName = name;
        this.mHeight = height;
    }
}

 
//演員選拔類(lèi)
public class Compare
{
    //導(dǎo)演導(dǎo)超女出生,喜歡一對(duì)一PK
    public Boy WhoIsBetter(Boy boy1, Boy boy2)
    {
        if (boy1.Height > boy2.Height)
        {
            return boy1;
        }
        else
        {
            return boy2;
        }
    }
}

 
//測(cè)試
static void Main(string[] args)
{
    Boy boy1 = new Boy("潘長(zhǎng)江", 165);
    Boy boy2 = new Boy("劉德華", 175);

    Console.WriteLine(new Compare().WhoIsBetter(boy1, boy2).Name);
    Console.ReadLine();
}
 
代碼很簡(jiǎn)單,Boy為男演員實(shí)體類(lèi),包含姓名和身高兩個(gè)字段屬性;Compare類(lèi)中的WhoIsBetter為選拔邏輯方法,負(fù)責(zé)選出兩個(gè)男演員中較高的那個(gè);測(cè)試結(jié)果:劉德華完勝。

任何行業(yè)都是一樣,需求變更無(wú)處不在。第二天,需要選女主角,導(dǎo)演說(shuō)了,女演員,苗條是王道。于是代碼變更,添加了女演員實(shí)體類(lèi),添加了女演員的選拔方法:

復(fù)制代碼 代碼如下:


//添加女演員實(shí)體
public class Girl
{
    //姓名
    private string mName;
    //體重
    private int mWeight;
    public string Name
    {
        get { return this.mName; }
    }
    public int Weight
    {
        get { return this.mWeight; }
    }

    public Girl(string name, int weight){
        this.mName = name;
        this.mWeight = weight;
    }
}

 
//演員選拔類(lèi)中添加一個(gè)女演員方法
public class Compare
{
    //男演員身高是王道
    public Boy WhoIsBetter(Boy boy1, Boy boy2)
    {
        if (boy1.Height > boy2.Height)
        {
            return boy1;
        }
        else
        {
            return boy2;
        }
    }

    //女演員苗條是王道
    public Girl WhoIsBetter(Girl girl1, Girl girl2)
    {
        if (girl1.Weight < girl2.Weight)
        {
            return girl1;
        }
        else
        {
            return girl2;
        }
    }
}

 
//測(cè)試
static void Main(string[] args)
{
    Boy boy1 = new Boy("潘長(zhǎng)江", 165);
    Boy boy2 = new Boy("劉德華", 175);

    Girl girl1 = new Girl("鞏俐", 120);
    Girl girl2 = new Girl("周迅", 80);

    Console.WriteLine(new Compare().WhoIsBetter(boy1, boy2).Name);
    Console.WriteLine(new Compare().WhoIsBetter(girl1, girl2).Name);
    Console.ReadLine();
}
 
結(jié)果選出了身高更高的劉德華,選出了體重更輕的周迅,導(dǎo)演很滿(mǎn)意。但從程序設(shè)計(jì)角度,這段代碼顯然不夠完美,第一天選男主角,第二天選女主角,往后還要選男配角,選女配角,選群眾......按目前方式,只有往Compare類(lèi)里不斷添加方法才能滿(mǎn)足導(dǎo)演需求,方法會(huì)越來(lái)越多,代碼會(huì)越來(lái)越長(zhǎng)。于是,我決定修改WhoIsBetter方法,讓它以后可以支持男主,女主,男配,女配,男群眾,女群眾甚至支持所有兩個(gè)對(duì)象之間的比較:

復(fù)制代碼 代碼如下:


///


/// 男演員:實(shí)現(xiàn)IComparable接口
///

public class Boy : IComparable
{
    //姓名
    private string mName;
    //身高
    private int mHeight;
    public string Name {
        get { return this.mName; }
    }
    public int Height {
        get { return this.mHeight; }
    }

    public Boy(string name, int height) {
        this.mName = name;
        this.mHeight = height;
    }

    public int CompareTo(object obj)
    {
        //比較身高
        return this.mHeight - ((Boy)obj).Height;
    }
}

///


/// 女演員:實(shí)現(xiàn)IComparable接口
///

public class Girl : IComparable
{
    //姓名
    private string mName;
    //體重 www.jb51.net
    private int mWeight;
    public string Name
    {
        get { return this.mName; }
    }
    public int Weight
    {
        get { return this.mWeight; }
    }

    public Girl(string name, int weight){
        this.mName = name;
        this.mWeight = weight;
    }

    public int CompareTo(object obj)
    {
        //比較體重
        return ((Girl)obj).Weight - this.mWeight;
    }
}
 
首先讓實(shí)體類(lèi)支持自定義的比較,男演員比較身高,女演員比較體重。自定義比較是通過(guò)實(shí)現(xiàn)IComparable接口完成的,在C#里但凡可以比較的類(lèi)型,比如int、double、char等都實(shí)現(xiàn)了IComparable接口。關(guān)于IComparable接口此處不作詳述,請(qǐng)讀者自行查閱相關(guān)資料。

復(fù)制代碼 代碼如下:


public class Compare
{
    //萬(wàn)物皆object
    public object WhoIsBetter(object obj1, object obj2)
    {
        object result = obj2;
        //判斷比較類(lèi)型必須相同
        if (obj1.GetType() == obj2.GetType())
        {
            switch (obj1.GetType().ToString())
            {
                //男演員選拔
                case "Generic.Boy":
                    if (((Boy)obj1).CompareTo(obj2) > 0)
                    {
                        result = obj1;
                    }
                    break;
                //女演員選拔
                case "Generic.Girl":
                    if (((Girl)obj1).CompareTo(obj2) > 0)
                    {
                        result = obj1;
                    }
                    break;
                //擴(kuò)展int類(lèi)型比較
                case "System.Int32":
                    if (((System.Int32)obj1).CompareTo(obj2) > 0)
                    {
                        result = obj1;
                    }
                    break;
                }
            }
            return result;
        }
    }


修改WhoIsBetter方法,除了支持對(duì)男演員、女演員的比較,為了展示其擴(kuò)展性,還新增了int類(lèi)型的比較。

復(fù)制代碼 代碼如下:


//測(cè)試
static void Main(string[] args)
{
     Boy boy1 = new Boy("潘長(zhǎng)江", 165);
     Boy boy2 = new Boy("劉德華", 175);

     Girl girl1 = new Girl("鞏俐", 120);
     Girl girl2 = new Girl("周迅", 80);

     Console.WriteLine(((Boy)new Compare().WhoIsBetter(boy1, boy2)).Name);
     Console.WriteLine(((Girl)new Compare().WhoIsBetter(girl1, girl2)).Name);
     Console.WriteLine(new Compare().WhoIsBetter(boy1.Height, boy2.Height));
     Console.WriteLine(new Compare().WhoIsBetter(girl1.Weight, girl2.Weight));

     Console.ReadLine();
}
 
測(cè)試結(jié)果:
劉德華
周迅
175
120
OK,截止目前,似乎比較完美了,男演員比身高,女演員比體重,還支持int類(lèi)型比大小,WhoIsBetter方法具有了重用性,如果有需要,往后還能擴(kuò)展,拿來(lái)比較任意兩個(gè)對(duì)象。在泛型出現(xiàn)以前,似乎確實(shí)比較完美,但這也只是相對(duì)的,我們來(lái)看看目前代碼的弱點(diǎn):
弱點(diǎn)1:方法的重用性
假設(shè)我們要讓W(xué)hoIsBetter方法支持更多類(lèi)型,比如支持基本的double,char,bool類(lèi)型,支持以后導(dǎo)演可能提出的配角比較,群眾比較,那么就必須不斷的擴(kuò)展方法內(nèi)部代碼,這帶來(lái)極大的維護(hù)成本。
弱點(diǎn)2:類(lèi)型安全問(wèn)題

復(fù)制代碼 代碼如下:


//測(cè)試
static void Main(string[] args)
{
    Boy boy1 = new Boy("潘長(zhǎng)江", 165);
    Boy boy2 = new Boy("劉德華", 175);

    Girl girl1 = new Girl("鞏俐", 120);
    Girl girl2 = new Girl("周迅", 80);

    Console.WriteLine(((Boy)new Compare().WhoIsBetter(boy1, girl1)).Name);
    Console.ReadLine();
}
 
如上代碼我拿潘長(zhǎng)江跟鞏俐去比較。雖然萬(wàn)能的object給我們帶來(lái)了便捷,同時(shí)也帶來(lái)了風(fēng)險(xiǎn),這段代碼編譯完全可以通過(guò),但運(yùn)行時(shí)會(huì)出現(xiàn)異常,girl對(duì)象是沒(méi)法轉(zhuǎn)換為Boy類(lèi)型的,現(xiàn)實(shí)里去韓國(guó)可以變性,但代碼里絕對(duì)不行。所以這個(gè)方法就像顆定時(shí)炸彈,一不小心傳錯(cuò)了參數(shù),就會(huì)導(dǎo)致嚴(yán)重后果,并且編譯階段完全不被發(fā)現(xiàn)。
弱點(diǎn)3:裝箱拆箱導(dǎo)致的性能問(wèn)題
當(dāng)向WhoIsBetter方法中傳遞int參數(shù)時(shí),object轉(zhuǎn)換為int導(dǎo)致了拆箱操作:
if (((System.Int32)obj1).CompareTo(obj2) > 0)
反編譯獲取MSIL:
IL_0093:  unbox.any  [mscorlib]System.Int32
C#是強(qiáng)類(lèi)型語(yǔ)言,但只要引用類(lèi)型與值類(lèi)型的相互轉(zhuǎn)換,就避免不了Box與Unbox。有關(guān)裝箱與拆箱的知識(shí)請(qǐng)讀者自行查閱相關(guān)資料,此處不作詳述。

理解泛型
OK,到泛型登場(chǎng)了,摘錄了一段MSDN中對(duì)泛型的描述:泛型類(lèi)和泛型方法同時(shí)具備可重用性、類(lèi)型安全和效率,這是非泛型類(lèi)和非泛型方法無(wú)法具備的。這三點(diǎn),跟我們上面的例子相吻合。
看看使用泛型的解決方案:

復(fù)制代碼 代碼如下:


public class Compare where T : IComparable
{
    public T WhoIsBetter(T t1, T t2)
    {
        if (t1.CompareTo(t2) > 0)
        {
            return t1;
        }
        else
        {
            return t2;
        }
    }
}

 
//測(cè)試
static void Main(string[] args)
{
    Boy boy1 = new Boy("潘長(zhǎng)江", 165);
    Boy boy2 = new Boy("劉德華", 175);

    Girl girl1 = new Girl("鞏俐", 120);
    Girl girl2 = new Girl("周迅", 80);

    Console.WriteLine((new Compare().WhoIsBetter(boy1, boy2)).Name);
    Console.WriteLine((new Compare().WhoIsBetter(girl1, girl2)).Name);
    Console.WriteLine(new Compare().WhoIsBetter(boy1.Height, boy2.Height));
    Console.WriteLine(new Compare().WhoIsBetter(boy1.Name, girl1.Name));
    Console.ReadLine();
}
 
這段代碼在優(yōu)雅度上完勝非泛型,并且可重用性大大提升,可以說(shuō)它支持所有類(lèi)型的比較,只要這個(gè)類(lèi)型實(shí)現(xiàn)了IComparable接口,同時(shí)一勞永逸,不再需要在方法內(nèi)部作任何擴(kuò)展。
public class Compare where T : IComparable{
    //...
}
泛型類(lèi)的定義是在類(lèi)名后面跟上,這個(gè)是泛型專(zhuān)用語(yǔ)法,T表示傳遞進(jìn)來(lái)的類(lèi)型,你也可以用別的字母代替。
where T : IComparable ,從字面上就能理解,這段表示對(duì)T的類(lèi)型約束。程序是遵循人的意志來(lái)執(zhí)行的,按前面的例子,如果莫名其妙的讓程序比較兩個(gè)object,它沒(méi)辦法知道該去怎么比較。所以我們必須告訴程序,T必須是可比較的類(lèi)型,T必須實(shí)現(xiàn)了IComparable接口。
關(guān)于泛型參數(shù)約束,MSDN提供了一張表格:

約束 說(shuō)明
T:結(jié)構(gòu) 類(lèi)型參數(shù)必須是值類(lèi)型??梢灾付ǔ齆ullable 以外的任何值類(lèi)型。
T:類(lèi) 類(lèi)型參數(shù)必須是引用類(lèi)型;這一點(diǎn)也適用于任何類(lèi)、接口、委托或數(shù)組類(lèi)型。
T:new() 類(lèi)型參數(shù)必須具有無(wú)參數(shù)的公共構(gòu)造函數(shù)。當(dāng)與其他約束一起使用時(shí),new() 約束必須最后指定。
T:<基類(lèi)名> 類(lèi)型參數(shù)必須是指定的基類(lèi)或派生自指定的基類(lèi)。
T:<接口名稱(chēng)> 類(lèi)型參數(shù)必須是指定的接口或?qū)崿F(xiàn)指定的接口??梢灾付ǘ鄠€(gè)接口約束。約束接口也可以是泛型的。
T:U 為T(mén) 提供的類(lèi)型參數(shù)必須是為U 提供的參數(shù)或派生自為U 提供的參數(shù)。

感謝各位的閱讀!關(guān)于“.NET中泛型怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


分享題目:.NET中泛型怎么用-創(chuàng)新互聯(lián)
鏈接URL:http://weahome.cn/article/isgoj.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部