C#泛型

泛型是一種思想,是將數據類型和算法相互拔離的思想,從而更靈活運用
 
泛型優缺點
  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博客 ” ,链接:http://blog.itpub.net/18757188/viewspace-589331/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/18757188/viewspace-589331/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值