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

ASP.NET
ASP.NET开发:简化应用程序的开发支持Web标准
asp.net XMLHttpRequest实现用户注册前的验证
asp.net 页面间传值方法小结
asp.net url重写浅谈
asp.net 验证码生成和刷新及验证
C#精髓 GridView72大绝技 学习gridview的朋友必看
实例说明asp.net中的简单角色权限控制
asp.net网站开发包wq.dll打包下载
js与ASP.NET 中文乱码问题
asp.net checkbox 动态绑定id GridView删除提示
asp.net TextBox回车触发事件 图片在img显示
asp.net 脏字典过滤问题 用正则表达式来过滤脏数据
asp.NET 脏字过滤算法
asp.NET 脏字过滤算法 修改版
asp.net sql 数据库处理函数命令
asp.net Javascript 的几种写法与提示
ASP.NET MVC学习笔记
asp.net 中国身份证号码验证代码 非正则
Asp.net中使用Sqlite数据库的方法
asp.net 中文字符串提交乱码的解决方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 133 ::
收藏到网摘: 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#泛型,实现有创新,在虚拟机级别支持,运行时支持泛型,性能有提升,但是不好编写泛型算法,不向后兼容。