Value Types and Reference Types

Visual Basic 中有两种类型:引用类型和值类型。 引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。 对于引用类型,两种变量可引用同一对象;因此,对一个变量执行的操作会影响另一个变量所引用的对象。 对于值类型,每个变量都具有其自己的数据副本,对一个变量执行的操作不会影响另一个变量(参数上的 ByRef 修饰符除外)。

值类型

如果数据类型将数据保存在自己的内存分配中,则该数据类型为“值类型”。 值类型包括:

  • 所有数值型数据类型

  • BooleanCharDate

  • 所有结构(即使其成员是引用类型)

  • 枚举,因为它们的基础类型始终是 SByteShortIntegerLongByteUShortUIntegerULong

每个结构都是值类型,即使其包含引用类型成员。 因此,诸如 CharInteger 之类的值类型由 .NET Framework 结构实现。

您可以使用保留关键字(例如 Decimal)声明值类型。 还可以使用 New 关键字初始化值类型。 如果类型具有采用参数的构造函数,这特别有用。 一个相关示例是 Decimal(Int32, Int32, Int32, Boolean, Byte) 构造函数,它从提供的部分生成一个新 Decimal 值。

引用类型

引用类型存储对其数据的引用。 引用类型包括:

  • String

  • 所有数组(即使其元素为值类型)

  • 类类型,如 Form

  • 委托

类是引用类型。 请注意,每个数组都是引用类型,即使其成员是值类型也是如此。

由于每个引用类型都表示一个基础 .NET Framework 类,因此必须在初始化该类型时使用 New Operator 关键字。 下面的语句初始化一个数组。

Dim totals() As Single = New Single(8) {}  

不是类型的元素

下面的编程元素不限定为类型,因为不能将任何这些元素指定为已声明元素的数据类型:

  • 命名空间

  • 模块

  • 事件

  • 属性和过程

  • 变量、常量和字段

使用 Object 数据类型

可以将引用类型或值类型分配给 Object 数据类型的变量。 Object 变量始终保存对数据的引用,而不是数据本身。 但是,如果将值类型分配给 Object 变量,则其行为就像它保存自己的数据一样。 有关详细信息,请参阅 Object 数据类型

可以通过将 Object 变量传递给 Microsoft.VisualBasic 命名空间的 Information 类中的 IsReference 方法来确定它是充当引用类型还是值类型。 如果 Object 变量的内容表示引用类型,则 Information.IsReference 返回 True

另请参阅