泛型是一種思想,是將數據類型和算法相互拔離的思想,從而更靈活運用
泛型優缺點
1.性能: 使用裝箱拆箱操作會性能損失比較大,而采用泛型可以指定特定類型,不需要裝拆箱
2.類型安全: 泛指定了特定的類型後不能亂用其它類型,否則編譯器會出錯
3.二進制代碼的重用: 泛型類只需要定義一次,可以用許多不同的類型進行實例化
4.代碼的擴展: JIT編譯器把泛型類統為內部碼時,會給每個值類型創建一個新類,而引用類型卻共享同一個內部類
的所有實現代碼,因為引用類型實例化泛型類只需要4字節的內存單元(32位系統),而值類型實例化泛型類對內存
的要求不同,所以會為每個值類型創建一個新類
命名約定
1.泛型類型的名稱用字母T作為前綴
2.如果沒有特殊要求,泛型類型允許用任意類替代,且只使用了一個泛型類型,就可以用字符T作為泛型類型的名稱
3.如果有特定的要求或使用了兩個或更多的泛型類型,就應該給泛型類型添加適當的描述信息
泛型集合類
在命名空間,System.Collections.Generic定義了許多集合類和泛型接口
接口
违规广告ection Add(),Clear(),Contains(),CopyTo(),Remove(),Count,IsReadOnly
IList Insert(),RemoveAt(),IndexOf(),Item
IEnumerable GetEnumerator() 對集合使用了foreach語句,就需要此接口
IEnumerator Current
IDictionary Add(),ContainsKey(),Remove(),TryGetValue(),Item,Keys,Values
IComparer Compare()
IEqualityComparer Equals(),GetHashCode()
集合類
List IList,违规广告ection,IEnumerable
Dictionary IDictionary,违规广告ection>,
IEnumerable>,ISerializable,IDeserializationCallback
SortedList IDictionary,违规广告ection>
IEnumerable>
LinkedList 违规广告ection,IEnumerable,Iserializable,IDeserializationCallback
Queue 违规广告ection,IEnumerable
Stack 违规广告ection,IEnumerable
定制的泛型集合類 命名空間System.Collections.ObjectModel
Collection IList,违规广告ection,IEnumerable
ReadOnlyCollection IList,违规广告ection,IEnumerable
KeyedCollection IList,违规广告ection,IEnumerable
詳解泛型集合類
List非常類似於ArrayList,而ArrayList可以添加任何類型,而List只能添加用特定類型類型化的類型對象
1.查找元素
List類提供了Find()和FindAll()方法
public T Find(Predicate match);
public List FindAll(Predicate match);
Predicate是一個委託
2.執行操作
List類提供了ForEach()方法
racers.ForEach(delegate(Racer r){Console.WriteLine(r);})//racers是一個對象集合
定義了匿名方法,參數為Racer一個對象,實現代碼就是輸出信息
3.排序
List可以對其元素排序,Sort()方法定義了幾個重載版本
public void List.Sort();//無參數的Sort()方法只能在集合中的元素實現了IComparable接口時使用
public void List.Sort(Comparision);//Comparison是一個方法的委託,該方法帶有兩個T類型的參數,返回類型是Int
public void List.Sort(IComparer);//必須有類來實現IComparer接口,此接口定義了用於排序的Compare方法
public void List.Sort(Int32,Int32,IComparer);
racers.Sort(delegate(Racer r1,Racer r2){return r1.Name.CompareTo(r2.Name);});
4.類型轉換
List的ConvertAll()方法可以把任意類型的集合轉換為另一種類型,其使用委託Converter,定義如下:
public sealed delegate TOutput Converter(TInput from);
List persons=racers.Converter(delete(Racer r)
{
//programming
return new Person();//創建Person對象返回
}
-----------------------------------------------------
Queue類與Queue類功能相同,遵循FIFO原則
1.添加元素
Queue.Enqueue(T);
2.刪除元素
T bject=Queue.Dequeue();
3.取元素個數
int i=Queue.Count;
-----------------------------------------------------
LinkedList類,它是一個雙向鏈表,優點是插入元素非常快,缺點是訪問元素所花時間比較長
1.LinkedList.Last //最後一個元素
2.LinkedList.AddLast(T) //添加一元素到最後
3.LinkedList.AddAfter(index,T) //在某元素後添加元素
4.T bject=LinkedList.First.Vlaue //取得第一個元素
5.LinkedList.RemoveFirst() //刪除頭一個元素
6.List>[index].Value,Previous,Next //當前值,前一個,下一個元素
創建定制的泛型類
1.默認值
不能把空值(Null)賦給泛型類型,原因是空值只能給引用類型,而泛型類型可以實例化值類型,所以采用以下寫法
T doc=default(T);
2.約束
對於需要調用的泛型類,因為要使用到其方法,所以必須定義一個Where子句,指定泛型類型可用的方法和屬性,
Where子句可以要求泛型類型實現一個接口,或派生於某個基類
泛型方法
方法中使用參數或變量,為使其靈活運用可寫成泛型方法
泛型方法也可以用Where子句來限制
泛型委託
由於程序需要執行到了才知道方法或將方法當成參數來用,必然引用委託,所以委託也可以泛型其參數和返回值
對於使用了泛型委託的泛型方法調用可以使用匿名方法塊調用,如需要多次調用還是需要寫成單個函數
Framework的其他泛型類型
位於命名空間System中
1.結構 Nullable,定義可空的值類型數據,根據HaveValue判斷其是否有值,如無則為Null
頻繁使用可空類型的一種特殊的語法 int? i;
可空類型可以使用算術運算符,如果其中一個為Null,它們的和就是Null
非可空類型可以轉換為可空類型,且總是成功
可空類型轉化為非可空類型可能會失敗,如果可空類型為Null轉化成非可空類型時會異常InvalidOperationException
除了可以顯式將可空類型轉化成非可空類型之外,還可以使用接合運算符??
int? x=GetNullableType();
int y=x??0;//如果x為空則y為0
2.EventHandler
事件委託共同點是第一個參數總是sender(object類型),第二個參數是包含事件特定信息的類型
public sealed delegate void EventHandler(object sender,EventArgs e)//原型寫法
public sealed delegate void EventHandler(object sender,TEventArgs e) where TEventArgs:EventArgs
3.ArraySegment
表示數組的一段,包含數組段的信息(偏移量和元素個數)
int[] arr={1,2,3,4,5,6,7,8};
ArraySegment segment=new ArraySegment(arr,2,3) //從數組中第三個元素到第六個元素
數組段可以用Array屬性訪問,segment.Array[i],也還有Offset和Count屬性 \
for (int i=segment.Offset; i {
Console.WriteLine(segment.Array[i];
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18757188/viewspace-589331/
,如需转载,请注明出处,否则将追究法律责任。