天天看點

泛型 Generic

泛型 什麼是泛型;如何聲明和使用泛型;泛型的延遲思想?泛型的好處和原理;泛型類、方法、接口、委托; 泛型限制,泛型緩存;[泛型支援的幾種限制類型]

什麼是泛型

  1. 就是在 聲明的時候,帶上一個<>,指定類型參數,調用的時候指定類型調用--泛型
  2. 泛型方法:一個方法滿足了不同類型的需求:
  3. 泛型類:一個類滿足了不同類的需求
  4. 泛型接口:一個接口滿足了不同接口的需求
  5. 泛型委托:一個委托滿足了不同委托的需求
    泛型 Generic
    泛型 Generic
    1 public static void ShowObject (string s){
     2 Console.WriteLine("this is {typeof(s).Name}");
     3 }
     4 public static void ShowObject (int i){
     5 Console.WriteLine("this is {typeof(i).Name}");
     6 }
     7 ///Object類型的方法
     8 ///為什麼可以傳入Int  String Datetime
     9 ///1.Object是所有類型的基類
    10 ///2.(任何父類出現的地方都可以使用子類來代替)裡氏替換原則
    11 public static void  ShowObject (Object o){
    12    Console.WriteLine("this is {typeof(o).Name}"); 
    13 }
    14 ///泛型的方法
    15 public static  void show<T>(T t){
    16     Console.WriteLine("this is {typeof(t).Name)");
    17 }      

    View Code

    泛型方法:在生命的時候,指定參數 T,T是什麼類型

    在調用的時候确定參數類型

    延遲聲明:在開發中,延遲一起可以延遲的處理,能晚點做,就盡量晚點做

    泛型在編譯之後,泛型參數會生成占位符`

    最終會根據調用生成不同的普通方法:

    泛型在.NetFramework2已經出來了;

    泛型不是文法糖

    使用的時候需要确定類型

    泛型限制,泛型緩存

    泛型限制

    [泛型支援的幾種限制類型]

    泛型類的五大限制 1. where T:struct 限定目前參數類型必須是值類型 2. where T:class 限定目前類型參數類型必須是引用類型 3. where T:new() 限定目前參數類型必須有一個無參構造器 4. where T:<base class name> 限定目前參數類型 必須是目前類 或者目前類為基類的類父類名 5. where T:<interface name>限定目前參數類型必須實作指定接口
    限制 說明
    where T:struct 對于結構限制,類型T必須是值類型
    where T:class 類限制指定類型T必須是引用類型
    where T:IFoo 指定類型T必須實作接口IFoo
    where T:Foo 指定類型T必須派生自基類Foo
    where T:new() 這是一個構造函數限制,指定類型T必須有一個預設構造函數
    where T1:T2 這個限制也可以指定,類型T1派生自泛型類型T2
    泛型 Generic
    泛型 Generic
    1   /// <summary>
     2         /// 增加 了限制,相當于擷取了便利;同時也需要付出成本
     3         /// 限制
     4         /// 基類限制: 限制這個T  就是People ,就限制隻能傳遞People或者Peoplede的子類
     5         /// 接口限制:  
     6         ///     可以調用接口中的方法--權利
     7         ///     調用的時候隻能傳遞實作過這個接口的類進入 --義務
     8         /// </summary>
     9         /// <typeparam name="T"></typeparam>
    10         /// <param name="TParamter"></param>
    11         public static void Show<T>(T TParamter) where T : People
    12         {
    13             Console.WriteLine($"{TParamter.ID}");
    14             Console.WriteLine($"{TParamter.Name}");
    15         }
    16         public class People
    17         {
    18             public int ID { get; set; }
    19             public string Name { get; set; }
    20         }      
    緩存就是一個暫存區; 字典緩存:靜态屬性常駐記憶體
    泛型 Generic
    泛型 Generic
    1 /// <summary>
     2     /// 字典緩存:靜态屬性常駐記憶體
     3     /// </summary>
     4     public class DictionaryCache
     5     {
     6         private static Dictionary<Type, string> _TypeTimeDictionart = null;
     7         /// <summary>
     8         /// 初始化
     9         /// </summary>
    10         static DictionaryCache()
    11         {
    12             Console.WriteLine("this  is DictionartCache 靜态構造函數");
    13             _TypeTimeDictionart = new Dictionary<Type, string>();
    14         }
    15         public static string GetCache<T>()
    16         {
    17             Type type = typeof(T);
    18             if (!_TypeTimeDictionart.ContainsKey(type))
    19             {// 沒有添加一次
    20                 _TypeTimeDictionart[type] = $"{typeof(T).FullName}_{DateTime.Now.ToString("yyyyMMddHHmmss.fff")}";
    21             }
    22             return _TypeTimeDictionart[type];
    23         }
    24     }
    25 static void Main(){
    26     
    27  string s =DictionaryCache.GetCache<string>();
    28 }      
    泛型緩存: 泛型類會很久調用的不用類型生成不同的副本
    泛型 Generic
    泛型 Generic
    1 /// <summary>
     2     /// 泛型緩存本質是一個泛型類
     3     /// </summary>
     4     /// <typeparam name="T"></typeparam>
     5     public class GenericCache<T> {
     6         static GenericCache() {
     7             Console.WriteLine("this is GenericCache 靜态構造函數");
     8             _TypeTime = $"{typeof(T).FullName}_{DateTime.Now.ToString("yyyyMMddHHmmss.fff")}";
     9         }
    10         private static string _TypeTime = "";
    11         public static string GetCache() {
    12             return _TypeTime;
    13         }
    14     }      

    協變

    Out 隻能做傳回值 ,不能做參數,其實是一種為了避開風險而存在的一種限制

    逆變

    In 不能做傳回值 ,隻能做參數,

    協變逆變可以組合使用

繼續閱讀