收藏 (0) +1 (0) +1 (0) +1
收藏成功查看收藏>>

正在阅读:C# 编程语言的未来功能C# 编程语言的未来功能

2009-03-12 23:34 出处:PConline 作者:Microsoft/ASPCool 责任编辑:ycx
多重约束 对于任何给定的类型参数,程序可以为其指定任意多个接口约束,但最多只能指定一个类约束。每个新约束都以另一个“参数-要求”对的形式进行声明,并且给定的泛型的每个约束都用逗号分隔。以下示例中的 Dictionary 类包含两种参数,KeyType 和 ValType。KeyType 类型参数有两个接口约束,而 ValType 类型参数有一个类约束: public class Dictionary where KeyType : IComparable, KeyType : IEnumerable, ValType : Customer { public void Add(KeyType key, ValType val) { ... switch(key.CompareTo(x)) { } ... } } 运行时的泛型 泛型类的编译方法与常规类的编译方法几乎没有差别。事实上,编译结果只不过是元数据和中间语言 (IL)。当然,为了接受代码中用户提供的类型,应对 IL 进行参数化。根据提供的类型参数是值类型还是引用类型,泛型的 IL 的用法会有所不同。 当将值类型作为参数首次构造泛型时,运行时将使用提供的参数替换 IL 中的相应位置来创建一个专用的泛型。针对每个用作参数的唯一值类型,将一次性创建专用的泛型。 例如,假设程序代码声明了一个由整数构造的 Stack: Stack stack; 此时,运行时将生成一个专用的 Stack 类,并用整数替换此类的相应参数。现在,无论程序代码何时使用整数 Stack,运行时都将重复使用生成的专用 Stack 类。以下示例将创建整数 Stack 的两个实例,每个实例均使用由此整数 Stack 的运行时所生成的代码来创建: Stack stackOne = new Stack(); Stack stackTwo = new Stack(); 但是,如果在程序代码中的其他位置又创建了一个 Stack 类,并使用不同的值类型(例如长整型或用户定义的结构)作为其参数,则运行时将生成其他形式的泛型,而这时会替换 IL 相应位置中的长整型参数。为使用值类型构造的泛型创建专用类的优点是可以获得更好的性能。毕竟每个专用的泛型类都是在“本地”包含值类型,因此不必再进行转换。 泛型与引用类型的工作方式稍有不同。首次使用任何引用类型构造泛型时,运行时用对象引用替换 IL 中的参数来创建专用的泛型。之后,每当使用引用类型作为参数实例化构造的类型时,无论构造的是何种类型,运行时都会重复使用先前创建的专用泛型。 例如,假设有两个引用类型,Customer 类和 Order 类,并进一步假设您创建了 Customer 类型的 Stack: Stack customers; 此时,运行时将生成专用 Stack 类,该类并不存储数据,而是存储随后填充的对象引用。假设下一行代码创建了一个其他引用类型的 Stack,称为 Order: Stack orders = new Stack(); 与值类型不同,没有为 Order 类型创建另一个专用的 Stack 类,而是创建了专用 Stack 类的实例并设置 orders 变量来引用它。对于替换类型参数的每个对象引用,按照 Order 类型的大小分配内存空间,并将指针设置为引用该内存位置。假设您随后遇到了一行用于创建 Customer 类型的 Stack 的代码: customers = new Stack(); 同上一个使用 Order 类型创建的 Stack 类一样,创建了专用 Stack 类的另一个实例,并将其中包含的指针设置为引用 Customer 类型大小的内存区域。由于不同的程序在引用类型的数量上存在着很大差异,因此泛型的 C# 实现通过将引用类型的数量减少到编译器为引用类型的泛型类创建的专用类数量,大大降低了代码的膨胀速度。 此外,当使用类型参数(无论是值类型还是引用类型)实例化泛型 C# 类时,可以在运行时使用反射和实际类型进行查询,并且可以确定其类型参数。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
手机访问回到顶部