通用类型系统概述

更新:2007 年 11 月

本节将介绍一些概念并定义术语,这有助于理解和使用用您的语言实现的通用类型系统。

类型的类别

通用类型系统支持两种一般类别的类型,每一类都细分成子类别:

  • 值类型

    值类型直接包含它们的数据,值类型的实例要么在堆栈上,要么内联在结构中。值类型可以是内联的(由运行库实现)、用户定义的或枚举的。有关内联值类型的列表,请参见 .NET Framework 类库

  • 引用类型

    引用类型存储对值的内存地址的引用,位于堆上。引用类型可以是自描述类型、指针类型或接口类型。引用类型的类型可以由自描述类型的值来确定。自描述类型进一步细分成数组和类类型。类类型是用户定义的类、装箱的值类型和委托

作为值类型的变量,每个都有自己的数据副本,因此对一个变量的操作不会影响其他变量。作为引用类型的变量可以引用同一对象;因此对一个变量的操作会影响另一个变量所引用的同一对象。

所有类型都派生自 System.Object 基类型。

下面的示例说明了引用类型与值类型之间的差异。

Class Class1
    Public Value As Integer = 0
End Class 'Class1

Class Test
    
    Shared Sub Main()
        Dim val1 As Integer = 0
        Dim val2 As Integer = val1
        val2 = 123
        Dim ref1 As New Class1()
        Dim ref2 As Class1 = ref1
        ref2.Value = 123
        Console.WriteLine("Values: {0}, {1}", val1, val2)
        Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value)
    End Sub 'Main
End Class 'Test
using System;
class Class1
{
public int Value = 0;
}
class Test
{
    static void Main() {
        int val1 = 0;
        int val2 = val1;
        val2 = 123;
        Class1 ref1 = new Class1();
        Class1 ref2 = ref1;
        ref2.Value = 123;
        Console.WriteLine("Values: {0}, {1}", val1, val2);
        Console.WriteLine("Refs: {0}, {1}", ref1.Value, ref2.Value);
    }
}

此程序的输出如下所示。

Values: 0, 123
Refs: 123, 123

以下关系图说明了这几种类型是如何相关的。注意,类型的实例可以只是值类型或自描述类型,即使这些类型有子类别也是如此。

类型类别

公共类型系统

有关每个类型的更多信息,请参见:值类型枚举委托数组接口指针

值和对象

值是数据的二进制表示形式,类型提供了一种解释该数据的方式。值类型直接以类型数据的二进制表示形式存储。引用类型的值是表示该类型的数据的位序列的位置。

每个值都有一个准确的类型,完全定义了值的表示形式和针对值定义的操作。自描述类型的值称为对象。通过检查值,总是可以确定对象的准确类型,但却不能这样处理值类型和指针类型。值可以有多种类型。一种实现某一接口的类型,其值也是该接口类型的值。同样,从某一基本类型派生的类型,其值也是该基本类型的值。

类型和程序集

运行库使用程序集来定位和加载类型。程序集清单包含运行库用来解析在程序集范围内进行的所有类型引用的信息。

运行库中的类型名称有两个逻辑部分:程序集名称和程序集内类型的名称。有着相同名称但位于不同程序集内的类型被定义为两种不同的类型。

程序集在开发人员所看到的名称范围与运行库系统所看到的名称范围之间提供了一致性。开发人员在程序集的上下文中创作类型。开发人员正在构建的程序集内容确立了在运行时的可用名称范围。

类型和命名空间

从运行库的角度看,命名空间只是类型名称的一个集合。特定语言所具有的构造和相应的语法可帮助开发人员构成类型的逻辑组,但运行库在绑定类型时并不使用这些构造。因此,ObjectString 类都是 System 命名空间的一部分,但运行库只识别每个类型的完整名称,它们分别为 System.ObjectSystem.String

您可以生成单个程序集,并使其公开的类型好像来自两个不同的分层命名空间,例如 System.CollectionsSystem.Windows.Forms。也可以构建两个程序集,均可导出名称中包含 MyDll.MyClass 的类型。

如果要创建一个工具将程序集中的类型表示为属于分层命名空间,该工具必须枚举程序集或程序集组中的类型,并分析类型名称以派生一个分层关系。

请参见

概念

.NET Framework 类库概述

公共语言规范

其他资源

公共语言运行库中的程序集

通用类型系统

公共语言运行库

元数据和自描述组件

跨语言互操作性