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:两个字符串不仅长度相 ...
随机推荐
- set集合,深浅拷⻉以及部分知识点补充
set集合,深浅拷⻉以及部分知识点补充内容:1. 基础数据类型补充2. set集合3. 深浅拷⻉主要内容: ⼀. 基础数据类型补充⾸先关于int和str在之前的学习中已经讲了80%以上了. 所以剩下的 ...
- python 学习笔记---Locust 测试服务端性能
由于人工智能的热度, python目前已经成为最受欢迎的编程语言,一度已经超越Java . 本文将介绍开源的python 测试工具: locust 使用步骤: 1. 安装python 3.0以上版本 ...
- 对话框 AlterDialog
AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("尊敬的用户"); bu ...
- js改变表单的内容样式
一.改变单个样式 var obj = document.getElementById("id"); obj.style.cssText = " display: ...
- 从零开始写bootloader(2)
下图是设置内核启动参数的存放图示,由于bootloader启动内核时,需要给内核传输一些启动参数,但是由于当bootloader把内核 启动之后,程序就跳转到内核中执行了,再也不会回到bootload ...
- Linux 下 mysql的基本配置
Linux 下 mysql的基本配置 2013年02月27日 ⁄ MySQL ⁄ 共 3000字 ⁄ 暂无评论 ⁄ 被围观 2,483 views+ 1. Linux mysql安装: $ yu ...
- 【centos】centos安装配置samba
因为我的centos为一台阿里云服务器,想和我本机(mac)进行文件共享.所以在我的阿里云上安装配置samba. 服务器环境:centos 7.3 本地环境:mac 第1步:首先查看是否已经安装过了s ...
- nginx安装扩展 sub_filter&http_ssl_module
nginx之所以轻,因为默认没有安装各种各样的扩展: nginx安装扩展插件: 下面列出两个可能会用到的插件 一.sub_filter内容过滤器,这个在nginx做http转发的时候会很常用 1.下载 ...
- sql按照中文拼音排序
select * from table order by convert(columnName using gbk) asc 注意:会导致全表扫描 建立冗余字段,插入数据时字段为convert(col ...
- jquery字符串相等判断
在jquery中字符串相等判断一直失败 原来是空格! string1, string2 若其中有一个为返回值或类似 $.trim(string1) == $.trim(string2) ------- ...