先看概念什么是泛型?
1、泛型是.net Framwork 2.0增加的新功能,注意泛型不是语法糖。
var i =10;
上面这句才是语法糖,编译器提供的便捷功能称之为语法糖
2、主要作用为了一个方法满足不同的类型的需求比如:一个方法完成多个实体查询,一个方法完成不同类型的数据展示,任意一个实体转换成一个json字符串,类型这些事情泛型很擅长,并且运行效率也非常高。
在没有引入泛型之前,我们先看看一个把数据添加到集合的方法。
添加int数值型:
public void Add(List
{
list.Add(a);
}
添加字符串:
public void Add(List
{
list.Add(a);
}
是不是要写两个方法?如果类似方法很多时候,就需要增加很多冗余代码,在没有引入泛型之前,那么可以写成一个合并方法
public void Add(List
{
list.Add(a);
}
但是这个有一个问题,Object会出现装箱和拆箱,会损耗程序的性能,作为一个有追求的程序猿,我们是尽量避免的。
如果用泛型就可以写成:
public void Add
{
list.Add(a);
}
泛型不会出现装箱和拆箱的问题。
CLR内建了一些优化措施。假如为一个特定的类型实参调用一个方法,以后再次使用相同的类型实参来调用这个方法。CLR只会为这个方法/类型组合编译一次代码,如果一个程序集使用Add<DateTime>, 一个完全不同的程序集(加载到一个AppDomain中)也使用Add<DateTime>, CLR只会为Add<DateTime>编译一次方法。
那么有哪些泛型呢?
泛型方法:为了一个方法满足不同的类型的需求
泛型类:一个类满足不同类型的需求 List Dictionary
泛型接口:一个接口满足不同类型的需求
泛型委托:一个委托满足不同类型的需求
3.泛型种类:泛型类、泛型方法、泛型接口、泛型委托。
4.泛型原理是----泛型为什么也可以支持不同类型的参数?
泛型声明方法时,并没有写死类型,T是什么?不知道 T要等着调用 的时候才指定
设计思想:延迟声明,推迟一切可以推迟的,一切能晚点做的事 ,就晚点做
泛型方法和性能跟普通方法一致,是好和速度快的的,而且还能一个方法满足多个不同类型,减少了代码量。
注意::::::
WebServices WCF 都不能用泛型,为什么?
/跨语言的,别的语言也不能用,不支持泛型。
服务在发布的时候必须是确定的,泛型在编译时确定 不了
5.声明泛型 方法名称后加上尖括号,里面是类型参数
类型参数实际上就是一个类型声明,方法就是可以用这个类型T了。
下面为演示
public class GenericTest
{
///
/// 多个类型参数 不能关键字作为参数 类型名称不能重复
///
///
///
public T Get
{
throw new Exception();
}
}
///
/// 泛型继承要指定父类类型
///
public class ChildClass:GenericClass
{
}
///
/// 泛型类子类
///
///
public class GenericChildClass
{
}
///
/// 泛型类
///
///
public class GenericClass
{
}
///
/// 泛型接口
///
///
public interface GenericInterface
{
}
///
/// 泛型委托
///
///
public delegate void Do