[C#基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

引言:

10年積累的網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站制作后付款的網(wǎng)站建設(shè)流程,更有廣安免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

前面專題主要介紹了C#1中的2個(gè)核心特性——委托和事件,然而在C# 2.0中又引入一個(gè)很重要的特性,它就是泛型,大家在平常的操作中肯定會(huì)經(jīng)常碰到并使用它,如果你對于它的一些相關(guān)特性還不是很了解,那就讓我們一起進(jìn)入本專題的學(xué)習(xí)的。

 

一、泛型的是什么

泛型的英文解釋為generic,當(dāng)然我們查詢這個(gè)單詞時(shí),更多的解釋是通用的意思,然而有些人會(huì)認(rèn)為明明是通用類型,怎么成泛型了的,其實(shí)這兩者并不沖突的,泛型本來代表的就是通用類型,只是微軟可能有一個(gè)比較官方的此來形容自己引入的特性而已,既然泛型是通用的, 那么泛型類型就是通用類型的,即泛型就是一中模子。 在生活中,我們經(jīng)常會(huì)看到模子,像我們平常生活中用的桶子就是一個(gè)模子,我們可以用桶子裝水,也可以用來裝油,牛奶等等,然而把這些都裝進(jìn)桶子里面之后,它們都會(huì)具有桶的形狀(水,牛奶和油本來是沒有形的),即具有模子的特征。同樣,泛型也是像桶子一樣的模子,我們可以用int類型,string類型,類去實(shí)例化泛型,實(shí)例化之后int,string類型都會(huì)具有泛型類型的特征就是說可以使用泛型類型中定義的方法,如List<T>泛型,如果用int去初始化它后,List<int>的實(shí)例就可以用List<T>泛型中定義的所有方法,用string去初始化它也一樣,和我們生活中的用桶裝水,牛奶,油等非常類似

二、C# 2.0為什么要引入泛型

大家通過第一部分知道了什么是泛型,然而C#2.0中為什么要引入泛型的?這答案當(dāng)然是泛型有很多好處的。下面通過一個(gè)例子來說明C# 2.0中為什么要引入泛型,然后再介紹下泛型所帶來的好處有哪些。

當(dāng)我們要寫一個(gè)比較兩個(gè)整數(shù)大小的方法時(shí),我們可能很快會(huì)寫出下面的代碼:

[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型
 public class Compare
    {
// 返回兩個(gè)整數(shù)中大的那一項(xiàng)
        public static int Compareint(int int1, int int2)
        {
   if (int1.CompareTo(int2) > 0)
            {
       return int1;
            }

   return int2;
        }
    }
[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

然而需求改變?yōu)橛忠獙?shí)現(xiàn)比較兩個(gè)字符串的大小的方法時(shí),我們又不得不在類中實(shí)現(xiàn)一個(gè)比較字符串的方法:

[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型
  // 返回兩個(gè)字符串中大的一項(xiàng)
        public static string Comparestring(string str1, string str2)
        {
   if (str1.CompareTo(str2) > 0)
            {
       return str1;
            }

   return str2;
        }
[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

如果需求又改為要實(shí)現(xiàn)比較兩個(gè)對象之間的大小時(shí),這時(shí)候我們又得實(shí)現(xiàn)比較兩個(gè)對象大小的方法,然而我們中需求中可以看出,需求中只是比較的類型不一樣的,其實(shí)現(xiàn)方式是完全一樣的,這時(shí)候我們就想有沒有一種類型是通用的,我們可以把任何類型當(dāng)做參數(shù)傳入到這個(gè)類型中去實(shí)例化為具體類型的比較,正是有了這個(gè)想法,同時(shí)微軟在C#2.0中也想到了這個(gè)問題,所以就導(dǎo)致了C#2.0中添加了泛型這個(gè)新的特性,泛型就是——通用類型,有了泛型之后就可以很好的幫助我們剛才遇到的問題的,這樣就解決了我們的第一個(gè)疑問——為什么要引入泛型。下面是泛型的實(shí)現(xiàn)方法:

[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型
 public class Compare<T> where T : IComparable
    {
public  static T CompareGeneric(T t1, T t2)
        {
   if (t1.CompareTo(t2) > 0)
            {
       return t1;
            }
   else
            {
       return t2;
            }
        }
    }
[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

這樣我們就不需要針對每個(gè)類型實(shí)現(xiàn)一個(gè)比較方法,我們可以通過下面的方式在主函數(shù)中進(jìn)行調(diào)用的:

[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型
 public class Program
    {
static void Main(string[] args)
        {
            Console.WriteLine(Compare<int>.CompareGeneric(3, 4));
            Console.WriteLine(Compare<string>.CompareGeneric("abc", "a"));
            Console.Read();
        }
    }
[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

通過上面的代碼大家肯定可以理解C# 2.0中為什么要引入泛型的,然而泛型可以給我們帶什么好處的呢?從上面的例子可以看出,泛型可以幫助我們實(shí)現(xiàn)代碼的重用,大家很清楚——面向?qū)ο笾械睦^承也可以實(shí)現(xiàn)代碼的重用,然而泛型提供的代碼的重用,確切的說應(yīng)該是“算法的重用”(我理解的算法的重用是我們在實(shí)現(xiàn)一個(gè)方法中,我們只要去考慮如何去實(shí)現(xiàn)算法,而不需要考慮算法操作的數(shù)據(jù)類型的不同,這樣的算法實(shí)現(xiàn)更好的重用,泛型就是提供這樣的一個(gè)機(jī)制)。

然而泛型除了實(shí)現(xiàn)代碼的重用的好處外,還有可以提供更好的性能和類型安全,下面通過下面一段代碼來解釋下為什么有這兩個(gè)好處的。

[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型
using System;using System.Collections;using System.Collections.Generic;using System.Diagnostics;
namespace GeneralDemo
{
public class Program
    {
static void Main(string[] args)
        {
            Stopwatch stopwatch= new Stopwatch();

   // 非泛型數(shù)組
            ArrayList arraylist = new ArrayList();

   // 泛型數(shù)組
            List<int> genericlist= new List<int>();
   // 開始計(jì)時(shí)
            stopwatch.Start();
   for (int i = 1; i < 10000000; i++)
            {
                genericlist.Add(i);
       ////arraylist.Add(i);
            }

   // 結(jié)束計(jì)時(shí)
            stopwatch.Stop();

   // 輸出所用的時(shí)間
            TimeSpan ts = stopwatch.Elapsed;
   string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
             ts.Hours, ts.Minutes, ts.Seconds,
             ts.Milliseconds/10);
            Console.WriteLine("運(yùn)行的時(shí)間:" + elapsedTime);
            Console.Read();
        }
    }
}
[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

當(dāng)我們把 arraylist.Add(i);這行代碼注釋掉來測試向泛型數(shù)組中加入數(shù)據(jù)的運(yùn)行時(shí)間,下面是我機(jī)器的上運(yùn)行的一個(gè)截圖:

[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

當(dāng)我們把 genericlist.Add(i);這行代碼注釋掉來測試向一個(gè)非泛型數(shù)組中加入數(shù)據(jù)的運(yùn)行時(shí)間,下面附上我機(jī)器上的運(yùn)行的時(shí)間截圖:

[C# 基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型

從兩個(gè)結(jié)果中就可以明顯看出 向泛型數(shù)組中的加入數(shù)據(jù)的效率遠(yuǎn)高于非泛型數(shù)組。有圖有真相,這樣就充分說明泛型的另一個(gè)好處——高性能,然而泛型類型也保證了類型安全(大家都知道,C#是一個(gè)強(qiáng)類型的語言的,強(qiáng)類型指的是在每定義一個(gè)變量都需要指定變量的類型),當(dāng)我們向這個(gè)泛型genericlist數(shù)組中添加string類型的值時(shí),此時(shí)就會(huì)造成編譯器報(bào)錯(cuò) “無法從“string”轉(zhuǎn)換為’int‘ ”

 

三、小結(jié)

本專題主要和大家分享了C# 2.0中為什么會(huì)引入委托,以及委托的好處,相信通過上面的介紹大家已經(jīng)對委托有一個(gè)簡單的認(rèn)識以及對于泛型所帶來的好處也有一個(gè)全面的認(rèn)識,對于泛型的高性能本專題并沒有給出原因,這個(gè)內(nèi)容將會(huì)在下面一個(gè)專題向大家介紹。

 

 

當(dāng)前題目:[C#基礎(chǔ)知識梳理系列]專題六:泛型基礎(chǔ)篇——為什么引入泛型
文章位置:http://muchs.cn/article4/ghioie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)品牌網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、動(dòng)態(tài)網(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)

網(wǎng)站托管運(yùn)營