NET中泛型的理解与简单代码示例
来源:互联网 发布:linux运维吧 编辑:程序博客网 时间:2024/06/08 12:09
我有一个梦想,是改变世界,这是很多技术人员的梦想;从小事做起,踏实做人做事,当身边的人或事因为自己能像更好的方向改变或发展的时候,那就是在改变世界,至花甲之时,可能我的梦想也无法实现,但我会一直追逐着他前行。我相信蝴蝶效应。荣耀的背后可这一道孤独。一起学习,一起进步。
泛型是具有占位符的类、结构、接口和方法,是编译器提供的功能
使用泛型–加快运行速度(泛型参数的实际类型参数在运行时均不会被消除,所以运行速度会因为类型转换的次数减少而加快)
用泛型–可用于反射编程(使用GetType方法可在程序运行时得知泛型及其类型参数的实际类型)
用泛型-可减少代码量(复用性)
泛型可使用where关键字进行约束–所以泛型是类型安全的
使用object也能简单实现多方法统一为一个的效果,但是针对值类型,将其作为object进行传参使用的时候,会将其封装为引用类型存入堆中(装箱),使用时候,通过指针指向堆在拆箱进行使用,那么就存在性能损耗;
声明:泛型的声明使用<>进行声明,如,在编译的时候,会编译为一个占位符;
原理:泛型是编译时动态解析(方法声明的时候没有指定参数类型,而是推迟到方法调用的时候进行类型解析指定),在调用的时候,根据你传入的参数的类型指定了具体类型,同时调用的时候,会根据参数类型生成与我们手动编写的实际类型方法一致的方法副本,那么其实在调用的时候,调用的是这个副本,那么就和调用我们手动编写的方法是一致的(只是这些代码是即时编译器–JIT帮我们写了),所以不存在性能损耗;这样一来,也减少的代码量,比如客户端的容量大小可以通过这些细节减少很多;
效率示例:
public class Person<T> where T : Human,new() {public T obj {get;set;} }
编译的时候编译为了一个带有占位符的方法
var person = new Person<Human>();person.SayHello(new Human() { Name = "YangJiaoLong", Age = 12 });
在运行时指定了具体参数–Human对象,即时编译器JIT生成具体方法副本
public class Person {public Human obj {get;set;} }
在程序运行期间该副本不会被清除,也不存在使用object等类似的强制转换,所以泛型是能够提高程序运行效率的
泛型约束 struct,class,基类名,接口名,new()
1、struct–值类型约束
2、class–引用类型约束
3、基类名–引用类型的一种,但范文确定了必须是该类或派生自该类
4、接口名–应用类型的一种,但范围确定了必须是该接口或派生自该接口
5、new()–必须有无参构造函数,组合使用放在最后,不可和struct组合使用
1,25,35,345,45,5
下面是泛型约束示例
/// <summary> /// 要求泛型参数必须是继承自Human的类或Human类 /// </summary> /// <typeparam name="T"></typeparam> public class Person<T> where T : Human,IAnimal,new() { } /// <summary> /// 要求泛型参数必须为引用类型 /// </summary> /// <typeparam name="T"></typeparam> public class Ameriacan<T> where T : class, new() { } /// <summary> /// 要求泛型参数必须为值类型 /// </summary> /// <typeparam name="T"></typeparam> public class England<T> where T : struct { } /// <summary> /// 要求泛型参数必须实现接口IAnimal /// </summary> /// <typeparam name="T"></typeparam> public class Animal<T> where T : IAnimal { } /// <summary> /// 多泛型参数示例 /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="T1"></typeparam> public class Italy<T,T1> where T:class where T1:struct { }
做架构的时候有一句经典的思想—-推迟一切能推迟的
- NET中泛型的理解与简单代码示例
- NET反射的简单理解与代码示例
- android_mvp理解与代码示例
- .Net 应用程序与进程的简单理解
- 指针与数组的示例代码(帮助理解)
- Qt中信号与槽的简单代码片段示例
- Asp.net 2.0 一个简单的联动DropDownList示例(示例代码下载)
- Asp.net 2.0 一个简单的联动DropDownList示例(示例代码下载)
- Asp.net 2.0 一个简单的联动DropDownList示例(示例代码下载)
- Asp.net 2.0 一个简单的联动DropDownList示例(示例代码下载)
- 简单的Spring.Net示例
- .NET反射的简单示例
- AJAX.NET的简单示例
- .NET反射的简单示例
- .NET反射的简单示例
- NET反射的简单示例
- 简单的跟踪示例代码
- ExpandableListView的简单代码示例
- iOS热更新实现方式
- 移植块设备驱动和虚拟网卡驱动
- google浏览器cookie文件位置
- 令人智熄的智(zhi)能(zhang)蛇
- tensorflow官网进不去,因为它的地址改变了。
- NET中泛型的理解与简单代码示例
- jstack详解
- javascript中BOM和DOM篇
- Android Lint增量扫描实战纪要
- 判断"CTRL" 键是否被按住
- Struts2 --- Struts2的运行流程及其工作原理
- 关于负数的右移与无符号右移运算小结
- bzoj4503
- 2017.12.22 自定义注解、AOP、拦截器