Structure 语句

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

语法

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

部件

术语 定义
attributelist 可选。 请参阅 属性列表
accessmodifier 可选。 可以是以下值之一:

- 公共
- 保护
- 朋友
- 私人
- 受保护的好友
- 专用保护

请参阅 Visual Basic 中的 Access 级别
Shadows 可选。 查看 阴影
Partial 可选。 指示结构的部分定义。 请参阅 部分
name 必填。 此结构的名称。 请参阅 声明的元素名称
Of 可选。 指定这是一个泛型结构。
typelist 如果使用 Of 关键字,则为必需。 此结构的类型参数列表。 请参阅 类型列表
Implements 可选。 指示此结构实现一个或多个接口的成员。 请参阅 Implements 语句
interfacenames 如果使用语句, Implements 则为必需。 此结构实现的接口的名称。
datamemberdeclarations 必填。 零个或多个ConstDimEnumEvent声明结构数据成员的语句。
methodmemberdeclarations 可选。 作为结构的方法成员Function零个或多个声明、OperatorPropertySub过程。
End Structure 必填。 终止 Structure 定义。

注解

Structure 语句定义可以自定义的复合值类型。 结构是以前版本的 Visual Basic 的用户定义类型(UDT)的通用化。 有关详细信息,请参阅 结构

结构支持与类相同的许多功能。 例如,结构可以具有属性和过程,它们可以实现接口,并且可以具有参数化构造函数。 但是,在继承、声明和用法等领域的结构和类之间存在显著差异。 此外,类是引用类型,结构是值类型。 有关详细信息,请参阅 结构和类

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

结构默认为 好友 访问。 可以使用访问修饰符调整其访问级别。 有关详细信息,请参阅 Visual Basic 中的 Access 级别

规则

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

  • 成员声明。 必须声明结构的每个成员。 结构成员不能受到 保护 ,也不能 Protected Friend 因为无法从结构继承任何内容。 但是,结构本身可以是 ProtectedProtected Friend

    可以在结构中声明零个或多个非共享变量或非共享的非自定义事件。 你不能只有常量、属性和过程,即使其中一些是非共享的。

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

  • 遗产。 结构不能继承自除所有结构继承的类型以外的 ValueType任何类型。 具体而言,一个结构不能从另一个结构继承。

    不能在结构定义中使用 Inherits 语句 ,甚至不能指定 ValueType

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

  • 默认属性。 结构最多可以使用默认修饰符将一个属性指定为其默认属性。 有关详细信息,请参阅 默认值

行为

  • 访问级别。 在结构中,可以使用其自己的访问级别声明每个成员。 所有结构成员默认为 公共 访问。 请注意,如果结构本身具有更受限的访问级别,则这会自动限制对其成员的访问,即使你使用访问修饰符调整其访问级别。

  • 范围。 结构在其包含命名空间、类、结构或模块的整个范围内。

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

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

    实例的生存期从 New Operator 子句创建时开始。 当保存它的变量的生存期结束时,它将结束。

    不能延长结构实例的生存期。 模块提供静态结构功能的近似值。 有关详细信息,请参阅 Module 语句

    结构成员的生存期取决于它们的声明方式和位置。 有关详细信息,请参阅 类语句中的“生存期”。

  • 资格。 结构外部的代码必须用该结构的名称限定成员的名称。

    如果嵌套结构中的代码对编程元素进行非限定引用,则 Visual Basic 首先在嵌套结构中搜索该元素,然后在其包含结构中,依此搜索到最外部的包含元素。 有关详细信息,请参阅 对声明元素的引用

  • 内存消耗。 与所有复合数据类型一样,无法通过添加结构成员的名义存储分配来安全地计算结构的总内存消耗量。 此外,无法安全地假定内存中的存储顺序与声明顺序相同。 如果需要控制结构的存储布局,可以将属性应用于StructLayoutAttributeStructure语句。

示例:

以下示例使用 Structure 语句为员工定义一组相关数据。 它显示数据的使用情况PublicFriendPrivate成员,以反映数据项的敏感度。 它还显示过程、属性和事件成员。

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

有关如何使用 Structures 的详细信息,请参阅 结构变量

另请参阅