我們今天來討論下泛型的用法。首先說下泛型的概念,用通俗的語言來講,泛型其實就是類的一個參數,但是要求參數必須是一個類,而不能是一個對象。很多人可能對泛型中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