C# 泛型与其他实现之间的差异 C++ 模板与 C# 泛型存在着显著的差别。C# 泛型被编译成 IL,这使得在运行时会智能地为每个值类型创建相应的专用类型,而为引用类型只会创建一次专用类型;C++ 模板实际上是代码扩展宏,它为提供给模板的每个类型参数生成一个专用类型。因此,当 C++ 编译器遇到模板(例如整数 Stack)时,它会将模板代码扩展为 Stack 类并将整数作为该类本身的类型包含在其中。无论类型参数是值类型还是引用类型,如果不专门设计链接器来降低代码膨胀速度,C++ 编译器每次都会创建一个专用类,从而导致比使用 C# 泛型更显著的代码膨胀速度。 而且,C++ 模板不能定义约束。C++ 模板只能通过使用一个成员(可能属于也可能不属于类型参数),隐式定义约束。如果最终传递给泛型类的类型参数中存在该成员,程序将正常运行。否则,程序将失败,并可能返回隐藏的错误信息。由于 C# 泛型可以声明约束,并且具有严格的类型,因此不存在这些潜在的错误。 现在,Sun Microsystems® 已经在新版本的 Java 语言(代码名称为“Tiger”)中添加了其他的泛型。Sun 选择的实现不需要修改 Java 虚拟机。因此,Sun 面临着如何在未修改的虚拟机上实现泛型的问题。 提出的 Java 实现使用与 C++ 中的模板和 C# 中的泛型类似的语法,包括类型参数和约束。然而,由于它处理值类型与处理引用类型的方式不一样,因此未修改的 Java 虚拟机不支持值类型的泛型。因此,Java 中的泛型无法得到有效的执行。事实上,Java 编译器会在需要返回数据时,从指定的约束(如果声明了)或基本对象类型(如果未声明约束)插入自动向下的类型转换。此外,Java 编译器将在运行时生成一个专用类型,然后使用它实例化任何构造类型。最后,由于 Java 虚拟机本身不支持泛型,因此无法在运行时确定泛型实例的类型参数,而且反射的其他用途也会受到严重限制。 其他语言中的泛型支持 Microsoft 的目标是在 Visual J#(TM)、Visual C++ 和 Visual Basic 中支持使用和创建泛型。尽管不同语言实现此功能的时间有早有晚,但 Microsoft 的所有其他三种语言都将包含对泛型的支持。同时,C# 小组正努力在泛型的基础运行时中加入相应的功能,为实现多语言支持奠定基础。Microsoft 与第三方语言合作伙伴紧密协作,以确保在基于 .NET 的语言中创建和使用泛型。 迭代程序 迭代程序是基于研究语言中的类似功能(例如 CLU、Sather 和 Icon)而构造的语言。简单说来,通过迭代程序,类型可轻松地声明 foreach 语句对其元素进行迭代的方式。 为什么需要迭代程序 现在,如果类需要使用 foreach 循环结构支持迭代操作,则它们必须实现“枚举器模式”。例如,编译器将左侧的 foreach 循环结构扩展为右侧的 while 循环结构: List list = ...; foreach(object obj in list) { DoSomething(obj); } Enumerator e = list.GetEnumerator(); while(e.MoveNext()) { object obj = e.Current; DoSomething(obj); 值得注意的是,为了使 foreach 循环能够正常运行,List 数据结构(所迭代的实例)必须支持 GetEnumerator 函数。创建 List 数据结构后,必须实现 GetEnumerator 函数,以返回 ListEnumerator 对象: public class List { internal object[] elements; internal int count; public ListEnumerator GetEnumerator() { return new ListEnumerator(this); } } 所创建的 ListEnumerator 对象不仅必须实现 Current 属性和 MoveNext 方法,而且还必须维护其内部状态,以便程序在每次执行该循环时都可以移到下一项。此内部状态机对于 List 数据结构而言比较简单,但对于需要递归循环的数据结构(例如二叉树)来说,该状态机将相当复杂。 由于实现此枚举器模式需要开发人员投入大量的精力并写大量代码,因此 C# 包含一种新的结构,使得类可以轻松地指示 foreach 循环对其内容进行迭代的方式。 |
正在阅读:C# 编程语言的未来功能C# 编程语言的未来功能
2009-03-12 23:34
出处:PConline
责任编辑:ycx
键盘也能翻页,试试“← →”键