WEB开发网
开发学院软件开发C语言 Effective C# 原则49:为C#2.0做好准备 阅读

Effective C# 原则49:为C#2.0做好准备

 2009-02-19 08:17:15 来源:WEB开发网   
核心提示: 为了实现范型,CLR以及MSIL语言经历了一些修改,Effective C# 原则49:为C#2.0做好准备(4),当你编译一个范型类时,MSIL为每一个参数化的类型预留了空间,二叉树以有序方式存储对象,也就是说,考虑下面两个方法的申明MSIL:To implement generics,

为了实现范型,CLR以及MSIL语言经历了一些修改。当你编译一个范型类时,MSIL为每一个参数化的类型预留了空间。考虑下面两个方法的申明MSIL:

To implement generics, the CLR and the MSIL language undergo some changes. When you compile a generic class, MSIL contains placeholders for each parameterized type. Consider these two method declarations in MSIL:

.method public AddHead (!0 t) {
}
.method public !0 Head () {
}

!0 就是一个为一个类型预留的,当一个实际的实例被申明和创建时,这个类型才创建。这就有一种替换的可能:

.method public AddHead (System.Int32 t) {
}
.method public System.Int32 Head () {
}

类似的,变化的实例包含特殊的类。前面的为整型的申明就变成了为样:

.locals (class List<int>)
newobj void List<int>::.ctor ()

这展示了C#编译器以及JIT编译是如何为一个范型而共同工作的。C#编译器生成的MSIL代码为每一个类型预留了一个空间,JIT编译器在则把这些预留的类型转换成特殊的类型,要么是为所有的引用类型用System.Object,或者对值类型言是特殊的值类型。每一个范型的变量实例化后会带有类型信息,所以C#编译器可以强制使用类型安全检测。

范型的限制定义可能会对你如何使用范型有很大的影响。记住,在CLR还没有加载和创建这些进行时实例时,用于范型运行时的特殊实例是还没有创建的。为了让MISL可以让所有的范型实例都成为可能,编译器须要知道在你的范型类中使用的参数化类型的功能。C#是强制解决这一问题的。在参数化的类型上强制申明期望的功能。考虑一个二叉树的范型的实现。二叉树以有序方式存储对象,也就是说,二叉树可以只存储实现了IComparable的类型。你可以使用约束来实现这一要求:

上一页  1 2 3 4 5 6  下一页

Tags:Effective 原则 做好

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接