泛型是C# 2.0版本才有的語言特性,是具有參數類型占位符的類、結構、接口和方法。這些占位符是類、結構、接口和方法所存儲或使用的一個或多個占位符。簡單來說,就是變量類型的參數化。
以下是詳細demo:
#region 泛型的約束 /// <summary> /// 1.0基類約束 /// </summary> /// <typeparam name="T">約束成了將來調用的時候只能傳入Pig本身或者其子類</typeparam> public class House<T> where T:Pig { } /// <summary> /// 2.0 引用類型約束 /// </summary> /// <typeparam name="T">約束成了將來調用的時候只能傳入引用類型參數</typeparam> public class House1<T> where T:class { } /// <summary> /// 3.0值類型約束 /// </summary> /// <typeparam name="T">約束成了將來調用的時候只能傳入值類型參數</typeparam> public class House2<T> where T:struct { } /// <summary> /// 4.0接口約束 /// </summary> /// <typeparam name="T">約束成了將來調用的時候只能傳入Ipig本身或者Ipig的實現類型參數</typeparam> public class House3<T>where T:IPig { } /// <summary> /// 5.0構造器約束 /// </summary> /// <typeparam name="T">約束成了將來調用的時候只能傳入 構造器參數</typeparam> public class House4<T>where T:class ,new() { T t; public House4() { t = new T(); } } /// <summary> /// 多個參數約束 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="V"></typeparam> public class House6<T, V> where T : class where V : struct { } #endregion #region 泛型的繼承 public class DogHouse6 : House6<Dog, int> { } public class DogHouse61<X, Y> : House6<X, Y> where X : class where Y : struct { } public class DogHouse62<X, Y> : House6<Pig, decimal> { } #endregion #region 泛型方法 /// <summary> /// 泛型方法 有下列任何一項 均構成重載: /// 1.泛型方法的參數個數不一致 /// 2.參數類型不一致 /// 3.類型占位符個數不一致 /// /// /// 泛型方法的類型占位符個數一致,但名字不一樣 不會構成重載 /// </summary> public class UserInfoBll { public T Get<T>(T t) { return t; } public string GetName<T>(T t, int num) { T tt = t; return "某一個參數類型為泛型,返回值為string"; } public string GetName<T, V>(T t, int num) { T tt = t; return "返回值"; } public T GetName<T>(string str) { return default(T); } public string GetName<T>(T t) { T tt = t; return "返回值"; } } public class UserInfoBll1<T> { T tt; public T GetT(T t) { tt = t; return tt; } } #endregion #region 泛型方法的重寫 public abstract class Father { public abstract T SayHi<T, U>(T t, U u) where U : T; // U必須繼承於T public abstract T Think<T>(T t) where T : Pig; } /// <summary> /// 子類重寫父類中的抽象泛型方法的時候,不需要單獨再將類型占位符 重新添加約束 /// </summary> public class Son : Father { public override T SayHi<T, U>(T t, U u) { return t; } public override T Think<T>(T t) { return default(T); } } #endregion
使用泛型進行緩存管理:
public class CacheMgr<T> { public static T Get(string cacheKey) { return (T)HttpRuntime.Cache[cacheKey]; } public static void Add<TT>(string cacheKey,TT value) { HttpRuntime.Cache[cacheKey] = value; } }