泛型是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;
}
}