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

ASP.NET
FreeTextBox(版本3.1.6)在ASP.Net 2.0中使用方法
.NET 常用功能和代码小结
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
asp.net IList查询数据后格式化数据再绑定控件
asp.net sql存储过程
asp.net 简单实现禁用或启用页面中的某一类型的控件
asp.net(c#)获取内容第一张图片地址的函数
The remote procedure call failed and did not execute的解决办法
ASP.NET 在线文件管理
asp.net 读取并修改config文件实现代码
ASP.NET Cookie 操作实现
asp.net Silverlight中的模式窗体
Silverlight中动态获取Web Service地址
asp.net Silverlight应用程序中获取载体aspx页面参数
asp.net 水晶报表隔行换色实现方法
asp.net 获取Gridview隐藏列的值
手动把asp.net的类生成dll文件的方法
asp.net 使用ObjectDataSource控件在ASP.NET中实现Ajax真分页
动态指定任意类型的ObjectDataSource对象的查询参数
asp.net Md5的用法小结

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


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