NET 泛型,详细介绍
今天的文章是因为再给一个朋友讲这个的时候随手记录下整理出来的。说白了就是把前辈们曾经给我吹过的我又吹了出去。
泛型:是C# FrameWork 2.0 时代 加入进来的,可以说对与Net开发人员来说泛型是无处不再的,喜欢看源码的同学,可能会有发现,包括MVC里面基本上也是有很多发泛型,还有很多设计模式也需要搭配泛型来实现,包括项目架构
泛型的存在,是代码利用率复用性都大大的提升了,有时候Object 也是可以起到相同的作用,为什么使用泛型 为什么不是用Obj ,我们来看一下:
下面我们列出两个最基础的方法:
/// <summary>
/// 返回int
/// </summary>
/// <param name="I"></param>
/// <returns></returns>
public int ShowInt(int I)
{
return I;
}
/// <summary>
/// 返回String
/// </summary>
/// <param name="I"></param>
/// <returns></returns>
public string ShowString (string I)
{
return I;
}
上面的两个方法自从参数 进来到参数出去的这一个过程中我们没有进行参数方面的转换,也就是说单纯的针对的参数类型上面我们程序代码是没有损失任何的性能的。一位没有存在拆箱装箱的过程。
我们在看两个方法:我们使用了在C# 1.0 时代就存在的一个类型 是Object
/// <summary>
/// 返回int
/// </summary>
/// <param name="I"></param>
/// <returns></returns>
public int ShowString(object I)
{
return Convert.ToInt32(I);
}
/// <summary>
/// 返回String
/// </summary>
/// <param name="I"></param>
/// <returns></returns>
public string ShowString(object I)
{
return I.ToString();
}
这里我们使用的阐述类型是Obj ,Object 是引用类型,也是所有类型的父类,可以包容所有的类型,但是就单说处理参数类型的时候我们需要去转换一下才能进行使用,在这个转换的过程中我们已经损失了性能,但是使用Obj 的时候我们可以和成一个方法减少代码量,提升了代码的复用率。
比如:
/// <summary>
/// 返回object
/// </summary>
/// <param name="I"></param>
/// <returns></returns>
public object ShowType(object I)
{
return I;
}
现在简写成为这样后,我们是一个公用的方法:虽然说内部不用去转换了但是,在调用后,还是需要类型的转换同样的需要损失性能。中间性能之所以会损失是因为Obj是引用类型,存放在堆上的,假如说我们传的参数是int或其他的值类型来使用我们的公共方法,就会进行一次包装的过程,把存放在栈里面的值类型移动包装成为引用类型存放到堆里面,使参数符合当前方法的类型,这个过成也就是装箱(需要重新分配内存),但是我们在使用的时候,又需要把他拿出来进行一下装换转换为值类型,这个过程又称为拆箱,
我们在来使用一个方法:使用 2.0时代出现的泛型:
/// <summary>
/// 返回 T
/// </summary>
/// <param name="Parameter"></param>
/// <returns></returns>
public T Show<s>(T Parameter)
{
return Parameter;
}
为什么会使用泛型 是因为泛型方法再调用的时候有延时声明的功能这里的延时声明式只参数,泛型里面的 T ,其实咱们也可以理解为 占位符具体为谁占位的,等到调用的时候才会知道。
如下:
int parameter = ;
//在调用的时候声明参数类型
parameter = new Common().Show<int>(parameter);
//如果调用的时候不去声明的话,JIT编译的时候野会帮我们自动计算
parameter = new Common().Show(parameter);
这个时候不会损耗什么性能。延时声明也是咱们在进行框架设计的时候常用的一种思想,提高框架的性能。泛型不只是可以声明泛型方法:
泛型类:
/// <summary>
/// CURD 操作类
/// </summary>
/// <typeparam name="T"></typeparam>
public class ConmonClass<T>
{
public void Add(T s) { };
public void Update(T s) { };
public void Del(T s) { };
public void Select(T s) { };
}
这样使用的话,在咱们真正的项目,我们可以把某些基础的操作用一个类去搞定,使用的时候调用就是了,减少代码的冗余,增加复用性,重用率。
泛型接口:
/// <summary>
/// CURD 操作接口类
/// </summary>
/// <typeparam name="T"></typeparam>
public interface ConmonInterface<T>
{
T Add(T s);
T Update(T s);
T Del(T s);
T Select(T s);
}
泛型委托:
//泛型委托
public delegate T GetHandler<T>();
我想以上的操作在我们开发项目的时候会经常见到,或使用到
以上代码需要我们注意的时候,泛型类不能被继承,如果想要继承的话需要在继承的时候,给我们的不确定参数确定下参数类型。包括泛型接口也是一样的。
如下:
public class Son : ConmonClass<Common>
{};
/// <summary>
/// 实现泛型接口
/// </summary>
public class SonInterface : ConmonInterface<Common>
{
public Common Add(Common s)
{
throw new NotImplementedException();
} public Common Del(Common s)
{
throw new NotImplementedException();
} public Common Select(Common s)
{
throw new NotImplementedException();
} public Common Update(Common s)
{
throw new NotImplementedException();
}
}
如果说不指定泛型类型的参数类型式其实我们一样是可以继承的。需用继承者同样是泛型的。
建议:长期使用Net的同学我想我们需要加强一下泛型的认识了,因为在NetCore中常常会使用依赖注入,在使用泛型类的时候我们可能会多少有点麻烦的,泛型方法相对来说要简单的,如果说要想让我们的框架实现高度的内聚,大家需要多多理解。
泛型的约束,多重约束相当重要,代表我们是否能很好的利用泛型。
泛型的约束类型大概分为如下几种:
引用类型约束: |
表明泛型参数只能是引用类型的: |
值类型约束: |
表明泛型参数只能是值类型的: |
无参数构造函数约束: |
泛型是可以实例化的。 |
基类约束 |
必须满足基类中的某些属性 |
接口约束 |
必须满足接口中的某些属性 |
具体的就不代码了。
有不足之处 希望大家指出相互学习,
本文原创:转载请注明出处 谢谢!
NET 泛型,详细介绍的更多相关文章
- 问题:C# Dictionary嵌套使用;结果:嵌套Dictionary添加 , C#2.0泛型详细介绍
Dictionary<int, Dictionary<string, string>> dict1 = new Dictionary<int, Dictionary< ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)
摘要 Java Annotation是JDK5.0引入的一种注释机制. 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annotation本来很简单的,结果说的人没说清楚 ...
- Java Annotation认知(包括框架图、详细介绍、示例说明)(转)
本文转自:http://www.cnblogs.com/skywang12345/p/3344137.html 网上很多关于Java Annotation的文章,看得人眼花缭乱.Java Annota ...
- springboot 学习之路 18(webflux详细介绍(2))
webflux的详细介绍 引言:上一节已经简单介绍webflux的一些基本概念,本章继续学习webflux的原理和实战方面的东西: Spring WebFlux架构: note:注意理解上面这张图.下 ...
- [No0000A7]批处理经常用到的变量及批处理>NUL详细介绍
绝对路径是指调用绝对的程序位置的路径,例如: start C:\Windows\test.exe 相对路径是文件改变路径以后还会按照变量的路径所在位置去调用,例如: start %WINDIR%\te ...
- linux配置网卡IP地址命令详细介绍及一些常用网络配置命令
linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-- 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置 ...
- _MSC_VER详细介绍
_MSC_VER详细介绍 转自:http://www.cnblogs.com/braver/articles/2064817.html _MSC_VER是微软的预编译控制. _MSC_VER可以分解为 ...
- php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系
以下PHP CGI.Fastcgi.PHP-FPM的一些信息归纳和汇总----->详细介绍与之间的关系 一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的 web ...
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...
- doT.js详细介绍
doT.js详细介绍 doT.js特点是快,小,无依赖其他插件. 官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolati ...
随机推荐
- 网络传输数据封装详解(IP,UDP,TCP)
IP数据包也叫IP报文分组,传输在ISO网络7层结构中的网络层,它由IP报文头和IP报文用户数据组成,IP报文头的长度一般在20到60个字节之间,而一个IP分组的最大长度则不能超过65535个字节. ...
- FastDFS单机版安装
FastDFS 分布式文件系统 1 目标 了解项目中使用FastDFS的原因和意义. 掌握FastDFS的架构组成部分,能说出tracker和storage的作用. 了解FastDFS+nginx上传 ...
- STM32f030f4p6 内部flash 打包读写
最近做到的项目在运行需要把一组uint8_t(unsigned char)的数据进行掉电储存,想到单片机STM32f030f4p6内部flash可以直接由程序操作,写了以下代码用于uint8_t数据打 ...
- JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明
1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...
- PAT1039: Course List for Student
1039. Course List for Student (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- 使用jmeter 进行接口的性能测试
1.启动jmeter:在bin下以管理员身份运行jmeter.bat,启动jmeter 2. 创建测试计划: 默认启动jmeter时会加载一个测试技术模板,保存测试计划:修改名称为Apitest,点击 ...
- 关于Linux虚拟化技术KVM的科普 科普五(From 世民谈云计算)
另一位大神写到KVM文章,KVM 介绍(1):简介及安装.KVM 介绍(2):CPU 和内存虚拟化.KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtual ...
- 第七章——集成学习和随机森林(Ensemble Learning and Random Forests)
俗话说,三个臭皮匠顶个诸葛亮.类似的,如果集成一系列分类器的预测结果,也将会得到由于单个预测期的预测结果.一组预测期称为一个集合(ensemble),因此这一技术被称为集成学习(Ensemble Le ...
- spring boot actuator专题
spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来说,可以有效地减少监控系统在采集应用指标时的开发量.当然,它也并不是万能的,有时候我们也需要对其做一些简单的 ...
- Hibernate中cascade作用
Hibernate中cascade作用 只有“关系标记”才有cascade属性: 一个操作因级联cascade可能触发多个关联操作.前一个操作叫“主控操作”,后一个操作叫“关联操作”. cascade ...