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:两个字符串不仅长度相 ...
随机推荐
- Vue之VueRouter
Vue之VueRouter实现原理 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- Shell教程 之流程控制
1. if else 1.1 if if语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if ...
- [剑指Offer]12-矩阵中的路径(回溯)
题目链接 https://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc?tpId=13&tqId=11218&t ...
- 项目总结03:window.open()方法用于子窗口数据回调至父窗口,即子窗口操作父窗口
window.open()方法用于子窗口数据回调至父窗口,即子窗口操作父窗口 项目中经常遇到一个业务逻辑:在A窗口中打开B窗口,在B窗口中操作完以后关闭B窗口,同时自动刷新A窗口(或局部更新A窗口)( ...
- stark组件之过滤操作【模仿Django的admin】
一.先看下django的admin是如何实现过滤操作 首先在配置类中顶一个list_filter的列表,把要过滤的字段作为元素写i进去就可以了 class testbook(admin.ModelAd ...
- 关于界面绘制过程多次回调ondraw()方法产生的问题
最近项目中,出现一个问题,要做成的效果是这样的,但是一进去就变成这样了, 后来发现,刚进去是正常的,一闪而过,就变成全部了. 界面绘制过程,ondraw() 会被多次回调. 就是说在第一次绘制的时候是 ...
- redhat 5.6安装wireshark
mkdir -p /mnt/cdrom mount -t iso9660 /dev/cdrom /mnt/cdrom cd mnt/cdrom/Server rpm -ivh lm_sensors-- ...
- js 横屏 竖屏 相关代码 与知识点
<!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...
- hdu 2647 (拓扑排序 邻接表建图的模板) Reward
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员 ...
- HDU_2136
#include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> ...