C#泛型

泛型是一種思想,是將數據類型和算法相互拔離的思想,從而更靈活運用
 
泛型優缺點
  1.性能: 使用裝箱拆箱操作會性能損失比較大,而采用泛型可以指定特定類型,不需要裝拆箱
  2.類型安全: 泛指定了特定的類型後不能亂用其它類型,否則編譯器會出錯
  3.二進制代碼的重用: 泛型類只需要定義一次,可以用許多不同的類型進行實例化
  4.代碼的擴展: JIT編譯器把泛型類統為內部碼時,會給每個值類型創建一個新類,而引用類型卻共享同一個內部類
    的所有實現代碼,因為引用類型實例化泛型類只需要4字節的內存單元(32位系統),而值類型實例化泛型類對內存
    的要求不同,所以會為每個值類型創建一個新類
 
命名約定
  1.泛型類型的名稱用字母T作為前綴
  2.如果沒有特殊要求,泛型類型允許用任意類替代,且只使用了一個泛型類型,就可以用字符T作為泛型類型的名稱
  3.如果有特定的要求或使用了兩個或更多的泛型類型,就應該給泛型類型添加適當的描述信息
 
 
泛型集合類
  在命名空間,System.Collections.Generic定義了許多集合類和泛型接口
  接口
      违规广告ection<T>               Add(),Clear(),Contains(),CopyTo(),Remove(),Count,IsReadOnly
      IList<T>                     Insert(),RemoveAt(),IndexOf(),Item
      IEnumerable<T>               GetEnumerator()  對集合使用了foreach語句,就需要此接口
      IEnumerator<T>               Current
      IDictionary<TKey,TValue>     Add(),ContainsKey(),Remove(),TryGetValue(),Item,Keys,Values
      IComparer<T>                 Compare()
      IEqualityComparer<T>         Equals(),GetHashCode()
 集合類
      List<T>                      IList<T>,违规广告ection<T>,IEnumerable<T>        
      Dictionary<TKey,TValue>      IDictionary<TKey,TValue>,违规广告ection<KeyValuePair<TKey,TValue>>,
                                   IEnumerable<KeyValuePair<TKey,TValue>>,ISerializable,IDeserializationCallback
 
      SortedList<TKey,TValue>      IDictionary<TKey,TValue>,违规广告ection<KeyValuePair<TKey,TValue>>
                                   IEnumerable<KeyValuePair<TKey,TValue>>
 
      LinkedList<T>                违规广告ection<T>,IEnumerable<T>,Iserializable,IDeserializationCallback
 
      Queue<T>                     违规广告ection<T>,IEnumerable<T>
 
      Stack<T>                     违规广告ection<T>,IEnumerable<T>
 
  定制的泛型集合類 命名空間System.Collections.ObjectModel
     
      Collection<T>                IList<T>,违规广告ection<T>,IEnumerable<T>
      ReadOnlyCollection<T>        IList<T>,违规广告ection<T>,IEnumerable<T>
      KeyedCollection<TKey,TItem>  IList<TItem>,违规广告ection<TItem>,IEnumerable<TItem>
 

詳解泛型集合類
 List<T>非常類似於ArrayList,而ArrayList可以添加任何類型,而List<T>只能添加用特定類型類型化的類型對象
 1.查找元素
    List<T>類提供了Find()和FindAll()方法
    public T Find(Predicate<T> match);
    public List<T> FindAll(Predicate<T> match); 
    Predicate<T>是一個委託
 
  2.執行操作
    List<T>類提供了ForEach()方法
    racers.ForEach(delegate(Racer r){Console.WriteLine(r);})//racers是一個對象集合
    定義了匿名方法,參數為Racer一個對象,實現代碼就是輸出信息
 
 3.排序
    List<T>可以對其元素排序,Sort()方法定義了幾個重載版本
    public void List<T>.Sort();//無參數的Sort()方法只能在集合中的元素實現了IComparable接口時使用
    public void List<T>.Sort(Comparision<T>);//Comparison<T>是一個方法的委託,該方法帶有兩個T類型的參數,返回類型是Int
    public void List<T>.Sort(IComparer<T>);//必須有類來實現IComparer<T>接口,此接口定義了用於排序的Compare方法
    public void List<T>.Sort(Int32,Int32,IComparer<T>);
 
    racers.Sort(delegate(Racer r1,Racer r2){return r1.Name.CompareTo(r2.Name);});
 
  4.類型轉換
    List<T>的ConvertAll()方法可以把任意類型的集合轉換為另一種類型,其使用委託Converter,定義如下:
    public sealed delegate TOutput Converter<TInput,TOutput>(TInput from);
 
    List<Person> persons=racers.Converter<Person>(delete(Racer r)
     {
        //programming
        return new Person();//創建Person對象返回
     }
 
-----------------------------------------------------
 Queue<T>類與Queue類功能相同,遵循FIFO原則
 1.添加元素
    Queue<T>.Enqueue(T);
  2.刪除元素
    T bject=Queue<T>.Dequeue();
  3.取元素個數
    int i=Queue<T>.Count;
 
-----------------------------------------------------
  LinkedList<T>類,它是一個雙向鏈表,優點是插入元素非常快,缺點是訪問元素所花時間比較長
  1.LinkedList<T>.Last //最後一個元素
  2.LinkedList<T>.AddLast(T) //添加一元素到最後
  3.LinkedList<T>.AddAfter(index,T) //在某元素後添加元素
  4.T bject=LinkedList<T>.First.Vlaue //取得第一個元素
  5.LinkedList<T>.RemoveFirst() //刪除頭一個元素
  6.List<LinkedListNode<T>>[index].Value,Previous,Next //當前值,前一個,下一個元素
 
 
創建定制的泛型類
 
 1.默認值
    不能把空值(Null)賦給泛型類型,原因是空值只能給引用類型,而泛型類型可以實例化值類型,所以采用以下寫法
    T doc=default(T);
 
 2.約束
    對於需要調用的泛型類,因為要使用到其方法,所以必須定義一個Where子句,指定泛型類型可用的方法和屬性,
    Where子句可以要求泛型類型實現一個接口,或派生於某個基類
 

泛型方法
  方法中使用參數或變量,為使其靈活運用可寫成泛型方法
  泛型方法也可以用Where子句來限制
 
泛型委託
  由於程序需要執行到了才知道方法或將方法當成參數來用,必然引用委託,所以委託也可以泛型其參數和返回值
  對於使用了泛型委託的泛型方法調用可以使用匿名方法塊調用,如需要多次調用還是需要寫成單個函數
 
Framework的其他泛型類型
  位於命名空間System中
  1.結構 Nullable<T>,定義可空的值類型數據,根據HaveValue判斷其是否有值,如無則為Null
    頻繁使用可空類型的一種特殊的語法 int? i;
    可空類型可以使用算術運算符,如果其中一個為Null,它們的和就是Null
    非可空類型可以轉換為可空類型,且總是成功
    可空類型轉化為非可空類型可能會失敗,如果可空類型為Null轉化成非可空類型時會異常InvalidOperationException
    除了可以顯式將可空類型轉化成非可空類型之外,還可以使用接合運算符??
    int? x=GetNullableType();
    int y=x??0;//如果x為空則y為0
 2.EventHandler<TEventArgs>
    事件委託共同點是第一個參數總是sender(object類型),第二個參數是包含事件特定信息的類型
    public sealed delegate void EventHandler(object sender,EventArgs e)//原型寫法
    public sealed delegate void EventHandler<TEventArgs>(object sender,TEventArgs e) where TEventArgs:EventArgs
  3.ArraySegment<T>
    表示數組的一段,包含數組段的信息(偏移量和元素個數)
    int[] arr={1,2,3,4,5,6,7,8};
    ArraySegment<int> segment=new ArraySegment<int>(arr,2,3) //從數組中第三個元素到第六個元素
    數組段可以用Array屬性訪問,segment.Array[i],也還有Offset和Count屬性  /
    for (int i=segment.Offset; i<segment.Offset+segment.Count;i++)
    {
      Console.WriteLine(segment.Array[i];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值