点击返回 .net 初级高级 武林秘籍内功
大纲:
1.泛型的由来: CLR+JIT 延迟申明
2.泛型与object的对比、代码举例
3.泛型类、泛型方法、泛型接口、泛型委托
4.泛型约束
5.泛型的协变逆变
1.泛型的由来: CLR+JIT 延迟申明
泛型基本概念:.NET 泛型是一个很强大的新特性,它为每一种对象生成一份单独的代码(也就是所谓的“实例化”),这一份量身顶做的代码具有很高的效率,是强类型的,不需要运行期多态的支持和负担,有了泛型,就不再需要Object类来参与实现一些通用类或方法了.
泛型的作用: 在CLR(common language runtime)1.0中,当要创建一个灵活的类或方法,但该类或方法在编译期问不知道使用什么类,就必须以System.Object类为基础进行处理,而Object类在编译期间没有类型安全性,又必须进行强制类型转换.另外,给值类型使用Object类会有性能损失,这给程序开发带来诸多不便.故在CLR 2.0(.NET 3.5基于CLR 2.0)中,提供了泛型.
扫描二维码关注公众号,回复:
8458920 查看本文章
通过使用泛型类型,可以根据需要,用特定的类型替换泛型类型,同时保证了类型安全性:如果某个类型不支持泛型类,编译器就会报错,以阻止程度发生运行期错误.正确使用泛型将大大提高代码的灵活性,结合一个优秀的设计模式,可以显著缩短开发时间.
总而言之:泛型,其实就是 CLR+JIT的支持,使用泛型,可以重用代码,由CLR+JIT延迟等编译和执行的时候生成一个个具体的类或方法等等 的副本。比如:public class A<T>类,这样,我new的时候,var aStr= new A<string>();var aInt=new A<int>();这样,其实在编译的时候,会生成 A_001(string) 类和A_002 (int)类。
2.泛型与object的对比、代码举例
以上要是看的不是很懂的,例子来了。
比如我们需要打印出,传入参数的类型名称,那么使用常规代码方式,有常用2种方式去实现:
第一种,就是new对象后,调用对应的show方法,如下:
常规代码使用(令狐冲练的武功就是这样的):
/// <summary> /// 打印个int值 /// </summary> /// <param name="iParameter"></param> public static void ShowInt(int iParameter) { Console.WriteLine("This is {0},parameter={1},type={2}", typeof(CommonMethod).Name, iParameter.GetType().Name, iParameter); } /// <summary> /// 打印个string值 /// </summary> /// <param name="sParameter"></param> public static void ShowString(string sParameter) { Console.WriteLine("This is {0},parameter={1},type={2}", typeof(CommonMethod).Name, sParameter.GetType().Name, sParameter); } /// <summary> /// 打印个DateTime值 /// </summary> /// <param name="oParameter"></param> public static void ShowDateTime(DateTime dtParameter) { Console.WriteLine("This is {0},parameter={1},type={2}", typeof(CommonMethod).Name, dtParameter.GetType().Name, dtParameter); } //如果做数据库查询,每一个实体对应的表,那岂不是每一个实体都要写一个方法吗?
使用object(岳不群自宫):
/// <summary> ///为什么用object 作为参数类型,调用的时候,可以把任何类型都传进来 /// ///C#: 任何父类出现的地方 都可以用子类代替; ///Object类型是一切类型的父类 /// ///Object 出现的都可以让任何类型传进来 /// /// 但是:有2个问题 /// 性能问题:会出现装箱和拆箱; /// 类型安全问题。 /// </summary> /// <param name="oParameter"></param> public static void ShowObject(object oParameter) { Console.WriteLine("This is {0},parameter={1},type={2}", typeof(CommonMethod), oParameter.GetType().Name, oParameter); }
泛型类使用(小林子的葵花宝典):
/// <summary> /// 泛型方法:需要在方法名的后面带一个<>,需要定义T, T是什么呢? 不知道, /// T:类型参数,只是一个占位符,类型在声明其实不确定,在调用的时候,确定类型。 /// /// 延迟声明,推迟一切可以推迟的,事情能晚点做就晚点做。 /// 在使用的时候,需要指定明确的类型 /// 泛型方法性能和普通方法差不多,可以用一个方法满足多个类型的需求 /// 鱼与熊掌兼得 /// 又叫马儿跑,又叫马儿不吃草 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="tParameter"></param> public static void Show<T>(T tParameter) { Console.WriteLine("This is {0},parameter={1},type={2}", typeof(CommonMethod), tParameter.GetType().Name, tParameter); }
点击返回 .net 初级高级 武林秘籍内功