婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > .NET開發基礎:從簡單的例子理解泛型 分享

.NET開發基礎:從簡單的例子理解泛型 分享

熱門標簽:萊蕪外呼電銷機器人價格 五常地圖標注 凱立德導航官網地圖標注 鄭州400電話辦理 聯通 電銷語音自動機器人 地圖標注和認領 長春呼叫中心外呼系統哪家好 戶外地圖標注軟件手機哪個好用 智能電話營銷外呼系統

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

復制代碼 代碼如下:

//男演員實體類
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;
    }
}

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

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

    Console.WriteLine(new Compare().WhoIsBetter(boy1, boy2).Name);
    Console.ReadLine();
}
 


代碼很簡單,Boy為男演員實體類,包含姓名和身高兩個字段屬性;Compare類中的WhoIsBetter為選拔邏輯方法,負責選出兩個男演員中較高的那個;測試結果:劉德華完勝。

任何行業都是一樣,需求變更無處不在。第二天,需要選女主角,導演說了,女演員,苗條是王道。于是代碼變更,添加了女演員實體類,添加了女演員的選拔方法:
 
復制代碼 代碼如下:

//添加女演員實體
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;
    }
}

 
//演員選拔類中添加一個女演員方法
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;
        }
    }
}

 
//測試
static void Main(string[] args)
{
    Boy boy1 = new Boy("潘長江", 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();
}
 


結果選出了身高更高的劉德華,選出了體重更輕的周迅,導演很滿意。但從程序設計角度,這段代碼顯然不夠完美,第一天選男主角,第二天選女主角,往后還要選男配角,選女配角,選群眾......按目前方式,只有往Compare類里不斷添加方法才能滿足導演需求,方法會越來越多,代碼會越來越長。于是,我決定修改WhoIsBetter方法,讓它以后可以支持男主,女主,男配,女配,男群眾,女群眾甚至支持所有兩個對象之間的比較:
 
復制代碼 代碼如下:

/// summary>
/// 男演員:實現IComparable接口
/// /summary>
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;
    }
}

/// summary>
/// 女演員:實現IComparable接口
/// /summary>
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;
    }
}
 


首先讓實體類支持自定義的比較,男演員比較身高,女演員比較體重。自定義比較是通過實現IComparable接口完成的,在C#里但凡可以比較的類型,比如int、double、char等都實現了IComparable接口。關于IComparable接口此處不作詳述,請讀者自行查閱相關資料。
 
復制代碼 代碼如下:

public class Compare
{
    //萬物皆object
    public object WhoIsBetter(object obj1, object obj2)
    {
        object result = obj2;
        //判斷比較類型必須相同
        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;
                //擴展int類型比較
                case "System.Int32":
                    if (((System.Int32)obj1).CompareTo(obj2) > 0)
                    {
                        result = obj1;
                    }
                    break;
                }
            }
            return result;
        }
    }
 

修改WhoIsBetter方法,除了支持對男演員、女演員的比較,為了展示其擴展性,還新增了int類型的比較。
 
復制代碼 代碼如下:

//測試
static void Main(string[] args)
{
     Boy boy1 = new Boy("潘長江", 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();
}
 


測試結果:
劉德華
周迅
175
120
OK,截止目前,似乎比較完美了,男演員比身高,女演員比體重,還支持int類型比大小,WhoIsBetter方法具有了重用性,如果有需要,往后還能擴展,拿來比較任意兩個對象。在泛型出現以前,似乎確實比較完美,但這也只是相對的,我們來看看目前代碼的弱點:
弱點1:方法的重用性
假設我們要讓WhoIsBetter方法支持更多類型,比如支持基本的double,char,bool類型,支持以后導演可能提出的配角比較,群眾比較,那么就必須不斷的擴展方法內部代碼,這帶來極大的維護成本。
弱點2:類型安全問題
 
復制代碼 代碼如下:

//測試
static void Main(string[] args)
{
    Boy boy1 = new Boy("潘長江", 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();
}
 


如上代碼我拿潘長江跟鞏俐去比較。雖然萬能的object給我們帶來了便捷,同時也帶來了風險,這段代碼編譯完全可以通過,但運行時會出現異常,girl對象是沒法轉換為Boy類型的,現實里去韓國可以變性,但代碼里絕對不行。所以這個方法就像顆定時炸彈,一不小心傳錯了參數,就會導致嚴重后果,并且編譯階段完全不被發現。
弱點3:裝箱拆箱導致的性能問題
當向WhoIsBetter方法中傳遞int參數時,object轉換為int導致了拆箱操作:
if (((System.Int32)obj1).CompareTo(obj2) > 0)
反編譯獲取MSIL:
IL_0093:  unbox.any  [mscorlib]System.Int32
C#是強類型語言,但只要引用類型與值類型的相互轉換,就避免不了Box與Unbox。有關裝箱與拆箱的知識請讀者自行查閱相關資料,此處不作詳述。

理解泛型
OK,到泛型登場了,摘錄了一段MSDN中對泛型的描述:泛型類和泛型方法同時具備可重用性、類型安全和效率,這是非泛型類和非泛型方法無法具備的。這三點,跟我們上面的例子相吻合。
看看使用泛型的解決方案:
 
復制代碼 代碼如下:

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

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

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

    Console.WriteLine((new CompareBoy>().WhoIsBetter(boy1, boy2)).Name);
    Console.WriteLine((new CompareGirl>().WhoIsBetter(girl1, girl2)).Name);
    Console.WriteLine(new Compareint>().WhoIsBetter(boy1.Height, boy2.Height));
    Console.WriteLine(new Comparestring>().WhoIsBetter(boy1.Name, girl1.Name));
    Console.ReadLine();
}
 


這段代碼在優雅度上完勝非泛型,并且可重用性大大提升,可以說它支持所有類型的比較,只要這個類型實現了IComparable接口,同時一勞永逸,不再需要在方法內部作任何擴展。
public class CompareT> where T : IComparable{
    //...
}
泛型類的定義是在類名后面跟上T>,這個是泛型專用語法,T表示傳遞進來的類型,你也可以用別的字母代替。
where T : IComparable ,從字面上就能理解,這段表示對T的類型約束。程序是遵循人的意志來執行的,按前面的例子,如果莫名其妙的讓程序比較兩個object,它沒辦法知道該去怎么比較。所以我們必須告訴程序,T必須是可比較的類型,T必須實現了IComparable接口。
關于泛型參數約束,MSDN提供了一張表格:

約束 說明
T:結構 類型參數必須是值類型。可以指定除Nullable 以外的任何值類型。
T:類 類型參數必須是引用類型;這一點也適用于任何類、接口、委托或數組類型。
T:new() 類型參數必須具有無參數的公共構造函數。當與其他約束一起使用時,new() 約束必須最后指定。
T:基類名> 類型參數必須是指定的基類或派生自指定的基類。
T:接口名稱> 類型參數必須是指定的接口或實現指定的接口??梢灾付ǘ鄠€接口約束。約束接口也可以是泛型的。
T:U 為T 提供的類型參數必須是為U 提供的參數或派生自為U 提供的參數。 

您可能感興趣的文章:
  • asp.net實現利用反射,泛型,靜態方法快速獲取表單值到Model的方法
  • 詳解.NET 4.0中的泛型協變(covariant)和反變(contravariant)
  • .NET基礎之自定義泛型分析
  • .net泛型通用函數的特殊問題的解決方法
  • 使用.NET中的Action及Func泛型委托深入剖析
  • .NET CORE動態調用泛型方法詳解

標簽:紅河 西寧 岳陽 西藏 衢州 福州 湖州 宣城

巨人網絡通訊聲明:本文標題《.NET開發基礎:從簡單的例子理解泛型 分享》,本文關鍵詞  .NET,開發,基礎,從,簡單,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《.NET開發基礎:從簡單的例子理解泛型 分享》相關的同類信息!
  • 本頁收集關于.NET開發基礎:從簡單的例子理解泛型 分享的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品国产一区二区三区久久影院| 国产白丝精品91爽爽久久| 波多野结衣精品在线| 日韩av中文字幕一区二区| 国产欧美久久久精品影院| 欧美精品久久久久久久多人混战| 粉嫩绯色av一区二区在线观看| 亚洲成人福利片| 亚洲美女电影在线| 国产精品视频你懂的| 精品成人佐山爱一区二区| 欧美挠脚心视频网站| 91在线观看免费视频| 丁香五精品蜜臀久久久久99网站 | 午夜精品福利一区二区三区av | 中文字幕中文字幕一区| 欧美mv日韩mv国产网站| 欧美日韩精品三区| 欧美日韩综合色| 91色乱码一区二区三区| 国产成人av电影在线播放| 一区二区激情视频| 精品国产乱码久久久久久久久| 在线一区二区三区| 91丨porny丨国产入口| 国产精品一级黄| 亚洲一区二区三区国产| 国产亚洲综合av| 国产三级三级三级精品8ⅰ区| 国产亚洲一区字幕| 国产夜色精品一区二区av| 精品久久久久香蕉网| 精品欧美一区二区在线观看| 欧美中文字幕一区二区三区| 欧美久久久久久久久| 91精品国产一区二区三区蜜臀| 欧美日韩三级一区二区| 欧美精选一区二区| 精品日产卡一卡二卡麻豆| 国产女人水真多18毛片18精品视频 | 久久久一区二区三区捆绑**| 久久精品亚洲麻豆av一区二区 | 欧美日韩精品专区| 337p日本欧洲亚洲大胆精品 | 91福利国产精品| 欧美日韩大陆一区二区| 欧美一区二区三区爱爱| 日韩精品在线看片z| 国产日韩影视精品| 亚洲一区二区三区中文字幕 | 在线电影院国产精品| 国产午夜精品久久久久久久 | 亚洲三级在线观看| 午夜精品久久久久久久| 麻豆91精品视频| 国产精品一级片| 在线免费一区三区| 精品国产免费人成电影在线观看四季| 久久久久久久久久久久久女国产乱| 国产精品毛片久久久久久| 亚洲一区二区欧美| 国产一区二区三区黄视频| 色8久久人人97超碰香蕉987| 欧美精品一区二区三区很污很色的 | 7777精品伊人久久久大香线蕉经典版下载 | 国内精品视频666| 91亚洲精品乱码久久久久久蜜桃 | 日韩欧美在线综合网| 亚洲欧洲国产日韩| 精品一区二区国语对白| 一本色道亚洲精品aⅴ| 欧美成人a∨高清免费观看| 一区二区免费在线播放| 国产成人精品影院| 欧美区视频在线观看| 久久久不卡网国产精品二区 | 555夜色666亚洲国产免| 亚洲日本在线观看| 国产乱人伦偷精品视频不卡| 欧美日韩国产美女| 国产精品女主播在线观看| 久久97超碰色| 日韩一区二区电影在线| 偷窥国产亚洲免费视频| 色婷婷精品大在线视频| 国产欧美精品一区二区色综合 | 亚洲国产日韩在线一区模特 | 亚洲蜜臀av乱码久久精品蜜桃| 国产aⅴ综合色| 欧美va亚洲va| 日本三级亚洲精品| 欧美无砖砖区免费| 亚洲成人av在线电影| 欧美日韩一级视频| 五月婷婷综合在线| 欧美剧情电影在线观看完整版免费励志电影| 亚洲精品中文在线影院| 97aⅴ精品视频一二三区| 久久精品在这里| 日本在线播放一区二区三区| 色综合久久久久久久| 国产精品久久久久影院亚瑟| 国产福利一区二区三区在线视频| 久久人人97超碰com| 国产制服丝袜一区| 91精品久久久久久久91蜜桃| 一区二区欧美在线观看| 欧美三级欧美一级| 亚洲成人免费在线| 欧美一级片在线| 久久99国产精品麻豆| 2017欧美狠狠色| 成人小视频在线| 亚洲免费视频成人| 欧美日本一道本在线视频| 精品亚洲成av人在线观看| 国产三级精品视频| 欧美无乱码久久久免费午夜一区 | 日韩一级片在线观看| 精品一区二区三区久久| 久久精品人人做| 99久久精品免费| 中文字幕一区二区三区在线播放| 91精彩视频在线观看| 夜夜嗨av一区二区三区中文字幕| 欧美日韩在线不卡| 激情文学综合插| 中文字幕欧美区| 欧美亚洲免费在线一区| 精品一区二区三区免费| 国产精品久久久久国产精品日日| 91搞黄在线观看| 麻豆精品在线观看| 亚洲欧洲美洲综合色网| 欧美亚洲日本国产| 国产最新精品免费| 亚洲一区二区精品久久av| 久久久不卡影院| www.综合网.com| 日韩黄色片在线观看| 中文在线资源观看网站视频免费不卡| 日本韩国欧美在线| 国产精品一区一区| 天涯成人国产亚洲精品一区av| 久久精品一区蜜桃臀影院| 欧美日韩另类一区| www.欧美.com| 国内精品不卡在线| 久久在线观看免费| 国产精品色哟哟| 国产麻豆成人精品| 国产麻豆精品95视频| 韩国精品免费视频| 国产精品丝袜在线| 久久99精品视频| 91偷拍与自偷拍精品| 久久久久国产精品麻豆ai换脸 | 久久精品一区二区三区四区| 欧美日韩成人综合天天影院 | 日韩不卡在线观看日韩不卡视频| 国产一区三区三区| 一本色道久久综合精品竹菊| 国产成人精品综合在线观看| 亚洲h在线观看| 美腿丝袜亚洲一区| 成人做爰69片免费看网站| 91免费观看在线| 欧美日本一道本在线视频| 精品久久久久一区| 99久久免费精品高清特色大片| 国产精品不卡在线观看| 91蝌蚪porny成人天涯| 亚洲日本免费电影| 欧美成人猛片aaaaaaa| 色综合中文综合网| 一区二区三区影院| 精品国产乱码久久久久久夜甘婷婷 | 丝袜亚洲精品中文字幕一区| 亚洲欧美偷拍卡通变态| 国产精品国产三级国产aⅴ原创| 亚洲国产精品黑人久久久| 国产日韩欧美精品综合| 久久精品水蜜桃av综合天堂| 久久精品亚洲一区二区三区浴池| 国产亚洲欧美日韩在线一区| 国产视频不卡一区| 亚洲天堂中文字幕| 亚洲成av人在线观看| 99精品在线观看视频| 国产精品久久久久aaaa樱花| 亚洲精品福利视频网站| 久久婷婷国产综合国色天香 | 国产日韩欧美一区二区三区综合| 欧美三级视频在线观看| 国产精品88av| 激情五月婷婷综合| 国产一区二区三区四| 久久99国产精品久久99| 精品一区二区在线观看| 美女在线视频一区|