泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
.net framework1.0时代,如果有以下需求,需要传递不同类型变量的值,并且打印该变量的值。
1 /// <summary>
2 /// 打印个int值
3 /// </summary>
4 /// <param name="iParameter"></param>
5 public static void ShowInt(int iParameter)
6 {
7 Console.WriteLine("This is {0},parameter={1},value={2}", typeof(CommonMethod).Name, iParameter.GetType().Name, iParameter);
8 }
9 /// <summary>
10 /// 打印个string值
11 /// </summary>
12 /// <param name="sParameter"></param>
13 public static void ShowString(string sParameter)
14 {
15 Console.WriteLine("This is {0},parameter={1},value={2}", typeof(CommonMethod).Name, sParameter.GetType().Name, sParameter);
16 }
17 /// <summary>
18 /// 打印个DateTime值
19 /// </summary>
20 /// <param name="oParameter"></param>
21 public static void ShowDateTime(DateTime dtParameter)
22 {
23 Console.WriteLine("This is {0},parameter={1},value={2}", typeof(CommonMethod).Name, dtParameter.GetType().Name, dtParameter);
24 }
1 /// <summary>
2 /// 打印个object值
3 /// 1 任何父类出现的地方,都可以用子类来代替,object是一切类型的父类
4 /// 2 使用Object产生两个问题:装箱拆箱、类型安全
5 /// </summary>
6 /// <param name="oParameter"></param>
7 public static void ShowObject(object oParameter)
8 {
9 Console.WriteLine("This is {0},parameter={1},value={2}", typeof(CommonMethod), oParameter.GetType().Name, oParameter);
10 }
1 /// <summary>
2 /// 泛型方法
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 /// <param name="tParameter"></param>
6 public static void Show<T>(T tParameter)//, T t = default(T
7 {
8 Console.WriteLine("This is {0},parameter={1},type={2}", typeof(CommonMethod), tParameter.GetType().Name, tParameter);
9 }
方法名称后面加上尖括号,<>里面是类型参数,类型参数实际上就是一个不确定类型T声明,声明过后方法就可以用这个不确定类型T了。在声明泛型时,并没有写死类型,T是什么?不知道,T要等着调用的时候才指定。正是因为没有写死,才拥有了无限的可能!!
延迟声明:推迟一切可以推迟的,一切能晚点再做的事儿,就晚点再做。深入一下,泛型的原理,泛型在代码编译时,究竟生成了一个什么东西?泛型不是一个简单的语法糖,是框架升级支持的。泛型方法的性能跟普通方法一致,是最好的,而且还能一个方法满足多个不同类型。
1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。(这是当今较常见的定义)
2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。(人们大多把这称作模板)不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。
一些强类型编程语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的编程语言只能达到部分目的。
泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。
由于.NET Framework 泛型的类型参数之实际类型在运行时均不会被消除,运行速度会因为类型转换的次数减少而加快。
1 Console.WriteLine(typeof(List<>));
2 Console.WriteLine(typeof(Dictionary<,>));
打印结果:
1 public List<T> GetList<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class, new()
2 {
3 SqlSugarClient ssc = new SugarHelper(ConnectionKey).GetSqlSugarClient();
4 List<T> t = ssc.Queryable<T>().Where(expression).ToList();
5 if (t != null && t.Count > 0)
6 {
7 return t;
8 }
9 return null;
10 }
public interface GenericInterface<T>
{
}
允许对个别泛型的类型参数进行约束,包括以下几种形式(假设 C是泛型的类型参数, 是一般类、泛类,或是泛型的类型参数):T 是一个类。T 是一个值类型。T 具有无参数的公有建构方法。T 实现接口 I 。T 是 C ,或继承自 C 。
每个不同的T,都会生成一份不同的副本,适合不同类型,需要缓存一份数据的场景,效率高。
1 /// <summary>
2 /// 每个不同的T,都会生成一份不同的副本,适合不同类型,需要缓存一份数据的场景,效率高。
3 /// </summary>
4 /// <typeparam name="T"></typeparam>
5 public class GenericCache<T>
6 {
7 static GenericCache()
8 {
9 Console.WriteLine("This is GenericCache 静态构造函数");
10 _TypeTime = string.Format("{0}_{1}", typeof(T).FullName, DateTime.Now.ToString("yyyyMMddHHmmss.fff"));
11 }
12 private static string _TypeTime = "";
13 public static string GetCache()
14 {
15 return _TypeTime;
16 }
17 }