c#泛型使用詳解

來源:互聯網
上載者:User

     我們今天來討論下泛型的用法。首先說下泛型的概念,用通俗的語言來講,泛型其實就是類的一個參數,但是要求參數必須是一個類,而不能是一個對象。很多人可能對泛型中T的作用不太理解,其中T在泛型中扮演的角色就相當於一個預留位置,確切的說,是類型預留位置。凡是出現T的地方都會替換成你所傳遞的類型。

那麼下面我們就來寫一個泛型的例子,讓大家體驗一下泛型的威力。

首先咱們來看常用的List<T>泛型集合

01,List<T>集合,其中T可以是任何類型(int,string,數群組類型,甚至是使用者自訂的類類型)

            List<string> intList = new List<string>();

            intList.Add("李曉玲");

            intList.Add("章子怡");

            foreach (string item in intList)

            {

                Console.WriteLine(item);

            }

也可以在聲明List<T>時使用類似於數組初始化器的集合初始化器。

例如:List<string>  nameList=new  List<string>(){“Jack”,”Rose”,”Harvard”};

(該特性在.net3.0以及更高版本中使用)

List<T>常用方法:

  1. 要向泛型中添加一個元素:使用Add()方法

                        添加多個元素:使用AddRange()方法

 2.在指定位置插入元素使用Insert()方法

3.訪問元素可以通過索引,也可以使用foreach迴圈遍曆

4.刪除元素可以使用Remove()或者RemovAt()方法,使用Clear()方法可以刪除所有元素。

然後來看下索引值對泛型集合Dictionary<key,value>

C#也為HashTable提供了泛型型別,即Dictionary<K,V>,通常稱為”字典”。

Dictionary<K,V>儲存資料的特點:

1, 儲存資料的方式和雜湊表類似,也是通過key/value儲存元素。

2, 鍵必須是唯一的。不能為null,但是如果值為參考型別,該值可以為空白。

主要屬性:count:擷取包含的鍵/值對數

                     Keys:鍵的集合

//02,Dictionary<K,V>集合

            Dictionary<string, string> dic = new Dictionary<string, string>();

            dic.Add("01", "李小龍");

            dic.Add("02","李連杰");

            //遍曆key

            foreach (string item in dic.Keys)

            {

                Console.WriteLine("key"+item+"  value"+dic[item]);

            }

            //一次性遍曆鍵和值

            foreach (KeyValuePair<string,string> item in dic)

            {

                Console.WriteLine("key"+item.Key+"   value"+item.Value);

            }

 這時候大家可能會有疑問,為什麼要用泛型呢?

泛型有三個好處:

1,實現演算法的重用。

在泛型出現之前,我們為了保證效能安全而自訂強型別集合時,就需要為每種類型建立幾乎相同自訂集合。這樣就會重複勞動而且可維護性差。

   2,避免拆箱和裝箱。

   這點大家可以這樣理解,使用ArrayList和HashTable存取變數,會帶來頻繁的裝箱(將實值型別轉換成參考型別)和拆箱(將參考型別轉換成實值型別)操作,對效能有所影響。

3,型別安全(編譯時間會自動檢測參數類型)

泛型的特點:

泛型將操作的資料類型定義為一個參數,型別參數使得設計如下類和方法成為可能。這些類和方法將一個或多個類型的指定延遲到用戶端代碼聲明並執行個體化類或方法的時候。

使用where約束型別參數

可以使用where約束型別參數:

   Where  T:struct 中T必須在其繼承鏈中有System.ValueType實值型別。

Where T:class 中T必須是參考型別

Where T:new()中T必須有一個預設的建構函式。在有多個約束的類型上,此約束必須列在末尾。

Where  T:NameOfBaseClass中T必須派生於NameOfBaseClass指定的類。

 

當然,泛型不僅能用在類上,也可單獨用在類的方法中,它可根據方法參數的類型自動適應各種參數,這樣的方法就叫做泛型方法。

Public  class  Stack2

{

      Public  void  Push<T>(Stack<T> s,  params T[] p)

{

       Foreach(T  t  in  p)

       {

          s.Push(t);

}

}

}

原來的類Stack一次只能Push一個資料,這個類Stack2擴充了Stack的功能,可以一次把多個資料壓入Stack中,其中Push是一個泛型方法。這個方法的調用樣本如下:

Stack<int>  stack=new  Stack<int>(100);

Stack2  mystack2=new  Stack2();

mystack2.Push(x,1,2,3);

string  str=string.Empty;

for(int i=0;i<3;i++)

{

    Str+=stack.Pop().ToString();

}

結果輸出str的值是64321

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.