当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > Java、C#泛型的一些个人看法

ASP.NET
C# Quoted-Printable编码、解码
asp.net Google的translate工具翻译 API
.NET读取所有目录下文件正则匹配文本电子邮件
asp.net 半角全角转化工具
AjaxControlToolKit 显示浏览者本地语言的方法
asp.net HTML文件上传标签
ASP.NET 绑定DataSet中的多个表
ASP.NET 重定向的几种方法小结
Asp.Net 重定向必须要知道的一些资料
ASP.NET 导出到Excel时保留换行的代码
Asp.Net Cache缓存使用代码
document.getElementsByName和document.getElementById 在IE与FF中不同实现
GridView单元格合并
asp.net 大文件上传控件
asp.net 日期函数 某月的第一天和最后一天的日期
asp.net 时间类 一周的周一和周末的日期
C# javaScript函数的相互调用
asp.net membership 密码重设
"虚拟路径"..."映射到另一个应用程序,这是不允许的!
如何传值在2个页面之间 要求不刷新父页面,并且不能用Querystring传值

ASP.NET 中的 Java、C#泛型的一些个人看法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 188 ::
收藏到网摘: n/a

  过去曾经有很长一段时间,直至现在,存在这样的一种观点,就是C#Java的实现更漂亮。《Think in java》的作者Bruce Eckel曾经公开质疑过Java 5提供的泛型。不过说实在,我一直不喜欢看Bruce Eckel的书,感觉上他不是一个有经验有深度的技术人员。

  我也很长一段实现认同这样的观点,因为人云亦云!

  在C# 2.0支持泛型,而且在虚拟机级别支持,一开始接触时,感觉是很震撼的,感觉到泛型从此走入主流应用开发了。和C++相比,没有C++模板那样强的功能,完全做不到产生式编程的效果,也做不到编译期计算的效果,但是它简单实用。

  Java 5也开始支持泛型,而且最终正式发行比C# 2.0要早,我之前就使用过Beta版本C#的泛型,也熟悉C++的模板语法,可能是内心的傲慢,或者是懒惰,开始时只是将就着按照传统的经验使用Java 5提供的泛型。

  对事物的一知半解总是令人困扰的,在阅读分析JDK源码时,总会遇到一些Java 5额外提供的泛型用法,一开始忽略不计,但是看多了总会注意到的。

  例如java.util.Collections类中的sort方法和binarySearch方法的接口:

  public static void sort(List list, Comparator c);
  public static int binarySearch(List> list, T key);

  extends和super这两个关键字是C#和C++的泛型中都没有的,为什么需要这样的功能呢?

  例如如下情形:

 

  class A { }
  class B extends A {}
  void addAll(List items) {}

  如下代码:

  List aList = ;
  List bList = ;
  addAll(aList); //可以
  addAll(bList); //编译不通过
  addAll(bList)是无法编译通过的,这一点在Java、C#、C++中都是如此,怎么办呢?在java中如下处理,修改addAll的接口,改为:
  void addAll(List items) {}

  这样,addAll(aList)和addAll(bList)都能够编译通过了。

  另外super关键在算法中更是好用,如上面介绍的Collections.sort方法。如果你想在C#中实现一个和java.util.Collections.sort一样的方法,你会发现那是做不到的!

  为什么C#和C++无法提供这样的功能呢?因为C#和C++都是运行时的泛型支持,bList和aList的类型是不一样的,List和List的实际类型都是不一样的,运行时对泛型的支持目前还无法象处理数组参数那样具备协变能力。而Java的实现是编译器的特性,这样做的缺点就是性能没有得到提升,但是可以提供更好的语法糖。

  想起ajoo以前发表的一个观点,就是在应用开发中,泛型提供的关键是类型安全,性能反而是其次。我对此十分认同,重新审视java的泛型,我们会发现其设计颇具创新,而且向后兼容良好!

  总结一下我的观点:

  Java的泛型,语法有创新,更好用,向后兼容,编写泛型算法更方便,但是没有带来性能提升。

  C#泛型,实现有创新,在虚拟机级别支持,运行时支持泛型,性能有提升,但是不好编写泛型算法,不向后兼容。