public class Mlist<T> { T[] arr = new T[10]; int index = 0; //新增元素的方法 public void add(T num) { //判斷是否越界 if (index >= arr.Length) { T[] newarr = new T[arr.Length * 2]; arr.CopyTo(newarr, 0); arr = newarr; } arr[index] = num; index++; } //索引器 public T this[int index] { get { if (index >= arr.Length) { throw new Exception("索引越界"); } return arr[index]; } } }
1.泛型
.framework2.0之後推出,是一種算法重用機制,可讓程序員在代碼中使用類型佔位符,將變量 或者參數的類型代替,在使用的時候傳入具體的類型
2.開放類型跟封閉類型
開放類型:程序員定義的泛型類--開放類型
封閉類型:實際使用的時候,會根據傳入的類型,生成新的類,這個類就叫作---封閉類型
3.泛型約束
默認的泛型什麼類型均可以往裏面傳
爲了可以進行約束
基類約束: public class AnimalPerson<T> where T : Person
只能傳person,跟pserson的子類
接口約束: public class WhitePerson<T> where T : IWhite, ISpeakEnglish
只能傳實現了接口的類
引用類型約束:public class PS<T> where T : class
只能傳應用類型,string
值類型約束: public class PS<T> where T : struct
只能傳值類型 int,bool
構造器約束 public class PS3<T> where T:Iwork,where T:new()
若是咱們須要在泛型類的內部使用new關鍵字建立T類型的變量,就必須使用構造器約束
default(類型) 返回默認值
注意若是要寫多個約束,逗號隔開,注意構造器約束只能寫在最後
4.泛型方法
普通類,跟泛型類內部均可以定義泛型方法
泛型方法必需要有類型佔位符 public void InT<T>(){}
泛型佔位符的試用位置
方法的形參:public void InT<T>(T t){}
方法的返回值:public T InT<T>(T t){}
注意,若是在方法中須要使用new關鍵字建立T類型的變量 必須添加構造器約束,跟泛型類的加法同樣
若是想要返回T類型的默認值 使用default(類型) 就能夠返回某個類型的默認值
5.泛型方法的重載
1.方法的形參個數不一樣
2.方法的形參類型不一樣
3.注意點:類型佔位符個數不一樣,也能構成重載程序員
5.5.優化緩存工具類
//存入數據
public static void AddObj(string cacheKey, object value)
{
HttpRuntime.Cache[cacheKey] = value;
} //使用泛型優化
public static T GetDateBetter<T> (string cacheKey) where T:class
{
//return (T)HttpRuntime.Cache[cacheKey];//把返回值進行轉型
return HttpRuntime.Cache[cacheKey] as T;
}
注意 若是想要使用 as來進行轉換 就必須加 應用類型約束
6.協變和逆變
適用狀況
只能用在泛型接口跟泛型委託裏面
泛型類跟泛型方法裏面不能用
協變
關鍵字爲Out
作用是標示此類型佔位符,不能做爲參數輸入,必須做爲返回值輸出
逆變
關鍵字爲in
作用是標示此類型佔位符,只能做爲參數輸入,而不能做爲返回值輸出
7.建立一個類的是否要傳入類型參數,取決於這個類是不是泛型類,跟這個類的父類沒有任何關係算法
//-----------------分割線---------------
新語法
01.自動屬性
02.隱式類型
var關鍵字,只能用在方法的內部(只能用在局部變量的聲明中)
必須在建立的時候就賦值,要肯定類型
必須聲明隱式類型的時候,就可以確認類型,不然報錯
好比null
肯定類型之後,不能改成其餘類型,
子類,父類是ok的
只須要看=右邊 就可以肯定類型
緩存