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#)的更多相关文章

  1. 开发语言性能对比,C++、Java、Python、LUA、TCC

    一直想做开发语言性能对比,刚好有时间都做了给大家参考一下, 编译类:C++和Java表现还不错 脚本类:TCC脚本动态运行C语言,性能比其他脚本快好多... 想玩TCC的同学下载测试包,TCC目录下修 ...

  2. [转帖]C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义

    C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义 https://blog.csdn.net/willyang519/article/d ...

  3. 常用的go语言IDE对比

    Go语言目前已经在开发者中越发的流行,自然很多人都在寻找合适的IDE来实现代码语法高亮.自动补全以及其他编辑特性. 下面就几种常用的IDE进行对比介绍: 1. Sublime text 这个文本编辑器 ...

  4. Python与C语言基础对比(Python快速入门)

    代码较长,建议使用电脑阅读本文. 10分钟入门Python 本文中使用的是Python3 如果你曾经学过C语言,阅读此文,相信你能迅速发现这两种语言的异同,达到快速入门的目的.下面将开始介绍它们的异同 ...

  5. 数学语言和程序语言的对比:面向过程与面向集合&命题

    共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序 ...

  6. 【接口时序】2、Verilog实现流水灯及与C语言的对比

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45 ...

  7. 各大语言性能对比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. ...

  8. iOS 开发学习-类的创建与实现,与java语言的对比

    Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { //在{}中定义属性(全局变量/实例变量 ...

  9. C语言 · 字符串对比

    问题描述 给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一: 1:两个字符串长度不等.比如 Beijing 和 Hebei 2:两个字符串不仅长度相 ...

随机推荐

  1. vue中使用全局函数

    方法一: 在mian.js中写入函数: Vue.prototype.bb = function () {        alert('OK'); } 然后在任何组件中都可以调用: this.bb() ...

  2. pta l3-7(天梯地图)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805051153825792 题意:给定n个地点,m条边以及边的 ...

  3. PTA 7-9 旅游规划(SPFA)

    有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便 ...

  4. C++ map中使用erase应该注意到的问题

    注意:此程序在win环境下会出现上述描述的问题:在mac环境下第一种方式是正常运行的.Map.erase有3个重载函数: void erase(iterator position); size_typ ...

  5. SA9 collections

    [定义]  表示object的集合 generic class:可以用于多种object, 抽象类的具体实现: [ArrayList] 动态添加,只能加Non-primitive type,要初始化长 ...

  6. JavaFX

    [AWT-SWING-JAVA FX] 多平台.多应用的现有通用类 [inner class] (member class)inside another class, outside any meth ...

  7. win8 IIS配置

    iis发展到win8已经到是iis8.0了.至于如何安装的,咱们接下来看.大体和iis6安装差别不大.iis8安装起来也是很方便的. 1.打开“控制面板”——“程序和功能”.如下图所示 2.点击“启用 ...

  8. swift4.2 打印所有系统字体

    func showAllFonts(){ let familyNames = UIFont.familyNames var index:Int = 0 for familyName in family ...

  9. Java_6 方法

    1方法的定义和使用的注意事项 方法:一些功能整合成一个功能模块 注意事项:  a: 方法不能定义在另一个方法的里面  b: 写错方法名字  c: 写错了参数列表  d: 方法返回值是void,方法中可 ...

  10. YII2表单中上传单个文件

    有些时候我们提交的表单中含有文件.怎么样让表单里的数据和文件一起提交. 我的数据表tb_user内容如下: CREATE TABLE `tb_user` ( `id` int(11) unsigned ...