Structure 语句

更新:2007 年 11 月

声明结构的名称,并引入结构包含的变量、属性、事件和过程的定义。

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _
Structure name [ ( Of typelist ) ]
    [ Implements interfacenames ]
        datamemberdeclarations
    [ methodmemberdeclarations ]
End Structure

各部分说明

  • attributelist
    可选项。请参见属性列表

  • accessmodifier
    可选项。可以是如下内容之一:

    请参见 Visual Basic 中的访问级别

  • Shadows
    可选项。请参见 Shadows

  • Partial
    可选项。指示结构的分部定义。请参见 分部 (Visual Basic)

  • name
    必选。此结构的名称。请参见已声明元素的名称

  • Of
    可选项。指定这是一个泛型结构。

  • typelist
    如果使用 Of 关键字,则为必选项。此结构的类型参数列表。请参见类型列表

  • Implements
    可选项。指示此结构实现一个或多个接口成员。请参见 Implements 语句

  • interfacenames
    如果使用 Implements 语句,则为必选项。此结构实现的接口的名称。

  • datamemberdeclarations
    必选。一个或多个 Const、Dim、Enum 或 Event 语句,声明结构的数据成员。

  • methodmemberdeclarations
    可选项。作为结构的方法成员的零个或多个 Function、Operator、Property 或 Sub 过程的声明。

  • End Structure
    必选。终止 Structure 定义。

备注

Structure 语句定义一种您可以自定义的复合值类型。“结构”是 Visual Basic 早期版本的用户定义类型 (UDT) 的泛化。有关更多信息,请参见 结构:您自己的数据类型

结构支持的许多功能与类支持的一样。例如,结构可以拥有属性和过程,可以实现接口,也可以拥有参数化的构造函数。但是,在某些地方(例如继承、声明和用法)结构和类之间存在着重大的差异。而且,类是引用类型,而结构是值类型。有关更多信息,请参见 结构和类

您只能在命名空间或模块级别使用 Structure。这意味着结构的声明上下文必须是源文件、命名空间、类、结构、模块或接口,不能是过程或块。有关更多信息,请参见 声明上下文和默认访问级别

结构默认为 Friend (Visual Basic) 访问级别。可以使用访问修饰符来调整它们的访问级别。有关更多信息,请参见 Visual Basic 中的访问级别

规则

  • **嵌套。**可以在一个结构中定义另一个结构。外部结构称为“包含结构”,而内部结构称为“嵌套结构”。但是,无法通过包含结构来访问嵌套结构的成员,而是必须声明一个嵌套结构的数据类型的变量。

  • **成员声明。**必须声明结构的每个成员。由于无法从结构中继承任何内容,因此结构成员不能是 Protected 或 Protected Friend。但是,结构本身可以是 Protected 或 Protected Friend。

    必须在结构中声明至少一个非共享的变量或非共享、非自定义的事件。在结构中不能只包含常数、属性和过程,即使某些成员是非共享的。

  • **初始化。**不能将结构的任何非共享数据成员的值初始化成其声明的一部分。必须通过结构上参数化的构造函数初始化此类数据成员,或者在创建了该结构的实例后将值赋给该成员。

  • **继承。**结构无法从除 ValueType(所有结构均从它继承)外的任何类型继承。特别地,一个结构无法从另一个结构继承。

    无法在结构定义中使用 Inherits 语句,即使是指定 ValueType 亦为如此。

  • **实现。**如果结构使用 Implements 语句,则必须实现您在 interfacenames 中指定的每个接口所定义的每个成员。

  • **默认属性。**通过使用 Default (Visual Basic) 修饰符,结构至多可以指定一个属性作为其默认属性。有关更多信息,请参见 默认属性

行为

  • **访问级别。**在结构中,可以利用成员自己的访问级别来声明每个成员。所有结构成员均默认为 Public (Visual Basic) 访问级别。请注意,如果结构本身具有限制性更高的访问级别,这会自动限制对其成员的访问,即使您使用访问修饰符来调整其成员的访问级别也是如此。

  • **范围。**结构的范围贯穿它的包含命名空间、类、结构或模块。

    结构成员的范围是整个结构。

  • **生存期。**结构本身没有生存期。相反,结构的每个实例具有独立于所有其他实例的生存期。

    实例的生存期在它由 New (Visual Basic) 子句创建时开始,并在保存实例的变量的生存期结束时结束。

    无法延长结构实例的生存期。模块提供了近似的静态结构功能。有关更多信息,请参见 Module 语句

    结构成员具有由如何以及在哪里声明它们决定的生存期。有关更多信息,请参见Class 语句 (Visual Basic) 中的“生存期”。

  • **限定。**结构外的代码必须用结构的名称来限定成员的名称。

    如果嵌套结构外的代码以非限定的方式引用某个编程元素,则 Visual Basic 会按此顺序搜索该元素:先在嵌套结构中搜索,然后在其包含结构中搜索,依此类推,一直到最外部的包含元素。有关更多信息,请参见 有多个同名变量时解析引用

  • **内存消耗。**与所有的复合数据类型一样,无法通过将结构成员名义上获分配的存储量相加,来确切计算出结构的总内存消耗量。此外,不能完全假定成员在内存中的存储顺序与声明的顺序相同。如果需要控制结构的具体存储安排,则可以将 StructLayoutAttribute 属性应用到 Structure 语句中。

示例

下面的示例使用 Structure 语句定义雇员的一系列相关数据。它演示了 Public、Friend 和 Private 成员的用法,从而反映数据项的敏感性。它还将显示过程、属性和事件成员。

Public Structure employee
    ' Public members, accessible from throughout declaration region.
    Public firstName As String
    Public middleName As String
    Public lastName As String
    ' Friend members, accessible from anywhere within the same assembly.
    Friend employeeNumber As Integer
    Friend workPhone As Long
    ' Private members, accessible only from within the structure itself.
    Private homePhone As Long
    Private level As Integer
    Private salary As Double
    Private bonus As Double
    ' Procedure member, which can access structure's private members.
    Friend Sub calculateBonus(ByVal rate As Single)
        bonus = salary * CDbl(rate)
    End Sub
    ' Property member to return employee's eligibility.
    Friend ReadOnly Property eligible() As Boolean
        Get
            Return level >= 25
        End Get
    End Property
    ' Event member, raised when business phone number has changed.
    Public Event changedWorkPhone(ByVal newPhone As Long)
End Structure

请参见

任务

如何:将用户定义的类型转换为 Visual Basic 结构

概念

结构和类

升级建议:在用户定义类型中避免使用数组和定长串

参考

Class 语句 (Visual Basic)

Interface 语句 (Visual Basic)

Module 语句

Dim 语句 (Visual Basic)

Const 语句 (Visual Basic)

Enum 语句 (Visual Basic)

Event 语句

Operator 语句

Property 语句