c#泛型与其他语言的对比(深入理解c#)
1.同c++模板的对比:
c++模板有点像是发展到极致的宏。他们非常强大,但代价就是代码膨胀和不易理解。
在c++中使用一个模板时,会为那一套特定的模板实参编译代码,好在模板实参本来就在源代码中一样。这意味着对约束的需求就不像对编译器需求那么多,因为编译器在为这一套特定的模板实参编译代码时,会检查你可以对类型执行哪些处理。不过,c++标准协会已经意识到约束仍然是有用的。约束又被包含进来,然后在c++11中删除了。
c++编译器具有一定的智能,针对任何给定的一套模板实参,代码都只会编译一次。但是,它还没有聪明到能共享代码的程度,就像CLR对引用类型做的那样,不过,不共享代码也是有好处的——它允许进行类型特有的优化,比如为一部分类型参数内联方法调用。但是,针对来自同一个模板的另一部分类型参数,则不内联方法调用。它还意味着能单独为每一套类型参数执行重载决策。而在c#的情况下,只能根据由现有约束为c#编译器提供的有限信息进行一次重载决策。
不要忘记,对于普通c++来书,编译是一次完成的,而不是想.NET模型那样,先编译成IL,再由JIT编译成本地代码。一个c++程序以10种不同的方式使用一个标准模板,就会在程序中包含代码10次。但是,在c#中,一个类似的程序如果以10种不同的方式使用来自框架的一个泛型类型,那么根本不会包含泛型类型的代码。相反,它只是引用一下泛型类型。执行时需要多少个不同的版本,JIT就会编译多少个。
c++模板比c#泛型好的一个地方在于,模板实参不要求必须是类型名,变量名,函数名和常量表达式也是允许的。一个常见的例子就是使用一个缓冲区类型,他将缓冲区的大小作为模板实参之一。所以,buffer<int,20>是包含20个int值的缓冲区,而buffer<double,35>是包含35个double值的缓冲区。这个功能对于模板元编程是至关重要的。作为一种高级的c++技术,模板元编程的基本思路令我感到害怕。但放在专家的手里,他又确实能发挥出强大的作用。
2.同Java泛型的对比:
c++模板为模板生成的代码要比c#为泛型生成的代码多一点。而Java生成的则要少一些。事实上,Java运行时根本不知道有泛型的存在。在为泛型类型生成的Java字节码(bytecode,大致和IL等价的一个术语)中,包含一些额外的元数据,来表示这是一个泛型。但是,在编译之后,负责调用的代码根本就发现不了曾有泛型出没的迹象。另外有一点可以肯定,泛型类型的实例只知道他自己非泛型方面的情况。例如,HashSet<E>的实例并不知道他自己被创建成一个HashSet<String>还是HashSet<Object>。编译器只是在必要的地方添加强制类型转换,并执行更稳妥的检查。可以将泛型类型作为一个“原始”类型使用,它相当于为每个类型实参都使用java.lang.Object。这种重写(会丢失信息)被称为类型擦除。java没有用户自定义的值类型,但就连内建的值类型也不能作为类型实参使用。相反,必须使用“已装箱”的版本,例如,对一个整数列表来说,就是ArrayList<Integer>。
Java泛型特性:
运行时虚拟机不知道关于泛型的一切,所以只要没有使用旧版本中不存在的类或方法,那么即使在代码中使用了泛型,编译之后代码一样可以在旧版本上运行。.NET的版本控制总体来说要严格的多——对于你引用的每个程序集,都可以指定版本号是否必须精确匹配。除此之外,生成时指定要在2.0CLR上运行的代码不能在.NET1上运行。
不需要学习一套新的类就可以使用Java泛型。非泛型开发者仍然使用ArrayList,泛型开发员只需使用ArrayList<E>。现有的类可以轻松的升级到泛型版本。
以前的特性通过反射系统被有效的利用——java.lang.Class(system.type的等价物)是泛型,它允许对编译时类型安全进行扩展,以覆盖涉及反射的许多情形。然而在其他一些情况下,他也会带来不便。
java使用通配符来支配协变性和逆变性。
c#泛型与其他语言的对比(深入理解c#)的更多相关文章
- 开发语言性能对比,C++、Java、Python、LUA、TCC
一直想做开发语言性能对比,刚好有时间都做了给大家参考一下, 编译类:C++和Java表现还不错 脚本类:TCC脚本动态运行C语言,性能比其他脚本快好多... 想玩TCC的同学下载测试包,TCC目录下修 ...
- [转帖]C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义
C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义 https://blog.csdn.net/willyang519/article/d ...
- 常用的go语言IDE对比
Go语言目前已经在开发者中越发的流行,自然很多人都在寻找合适的IDE来实现代码语法高亮.自动补全以及其他编辑特性. 下面就几种常用的IDE进行对比介绍: 1. Sublime text 这个文本编辑器 ...
- Python与C语言基础对比(Python快速入门)
代码较长,建议使用电脑阅读本文. 10分钟入门Python 本文中使用的是Python3 如果你曾经学过C语言,阅读此文,相信你能迅速发现这两种语言的异同,达到快速入门的目的.下面将开始介绍它们的异同 ...
- 数学语言和程序语言的对比:面向过程与面向集合&命题
共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序 ...
- 【接口时序】2、Verilog实现流水灯及与C语言的对比
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45 ...
- 各大语言性能对比PK数据
这里我用的python版本是Python 3.6.2(64位),php版本是PHP 7.0.12(64位),node版本是v6.11.0(64位),Go 1.8.3(64位),C# 基于.Net 4. ...
- iOS 开发学习-类的创建与实现,与java语言的对比
Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { //在{}中定义属性(全局变量/实例变量 ...
- C语言 · 字符串对比
问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...
随机推荐
- Linux 字符设备驱动及一些简单的Linux知识
一.linux系统将设备分为3类:字符设备.块设备.网络设备 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见 ...
- ssh 与远程机器保持心跳(linux)
文件/etc/ssh/ssh_config末尾加上: TCPKeepAlive yes ServerAliveInterval
- C++中的构造函数
C++中的构造函数可以分为4类: (1)默认构造函数.以Student类为例,默认构造函数的原型为 Student()://没有参数 (2)初始化构造函数 Student(int num,int ag ...
- 录音器 AudioRecorder
实现录音器有两种方式可以选择: 1.AudioRecord(基于字节流录音) 优点:可以实现语音的实时处理,进行边录边播,对音频的实时处理. 缺点:输出的是PCM的语音数据,如果保存成音频文件是不能被 ...
- Python常用库大全,看看有没有你需要的
作者:史豹链接:https://www.zhihu.com/question/20501628/answer/223340838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- SQL2008用sql语句给字段添加说明
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'字段说明文字' , @level0type=N'SCHEMA',@l ...
- 先安装win7时IIS的安装
打开“控制面板”->选择“程序”->选择“打开或关闭windows功能”->在“Internet信息服务”中勾选以下勾选框
- 四元数运动学笔记(5)IMU驱动的运动误差方程
1.扩展卡尔曼滤波EKF1.1线性化卡尔曼滤波1.2偏差微分方程的推导1.3线性化卡尔曼滤波的流程1.4 离散EKF2.误差状态的运动方程2.1连续时间的IMU系统动态方程2.1.1相关变量2.1.2 ...
- python添加fluent日志记录-aop
python添加fluent日志,aop实现 1.配置fluent相关信息 fluent_config.ini fluent_config.ini [fluent.aop] #is support f ...
- essential c++ 第一章 array及vector相关使用
将对象初始化: 1.用等号(=)赋值运算符初始化,针对对象是内置类型或者对象可以单一值初始化 2.构造函数初始化,针对对象需要多个初始值的情况 单括号括住的字符表示字符常量(‘ ’): 第一个反斜线表 ...