泛型 什麼是泛型;如何聲明和使用泛型;泛型的延遲思想?泛型的好處和原理;泛型類、方法、接口、委托; 泛型限制,泛型緩存;[泛型支援的幾種限制類型]
什麼是泛型
- 就是在 聲明的時候,帶上一個<>,指定類型參數,調用的時候指定類型調用--泛型
- 泛型方法:一個方法滿足了不同類型的需求:
- 泛型類:一個類滿足了不同類的需求
- 泛型接口:一個接口滿足了不同接口的需求
- 泛型委托:一個委托滿足了不同委托的需求
泛型 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 不能做傳回值 ,隻能做參數,
協變逆變可以組合使用