Structure 语句

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

语法

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

组成部分

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

- Public
- Protected
- Friend
- Private
- Protected Friend
- Private Protected

请参阅 Access levels in Visual Basic
Shadows 可选。 请参阅 Shadows
Partial 可选。 指示结构的部分定义。 请参阅 Partial
name 必需。 此结构的名称。 请参阅 Declared Element Names
Of 可选。 指定这是一种泛型结构。
typelist 如果使用 Of 关键字,则是必需的。 此结构的类型参数列表。 请参阅类型列表
Implements 可选。 指示此结构实现一个或多个接口的成员。 请参阅 Implements 语句
interfacenames 如果使用 Implements 语句,则是必需的。 此结构实现的接口的名称。
datamemberdeclarations 必需。 零个或多个 ConstDimEnumEvent 语句,声明结构的数据成员。
methodmemberdeclarations 可选。 FunctionOperatorPropertySub 过程的零个或多个声明,它们充当结构的方法成员。
End Structure 必需。 终止 Structure 定义。

注解

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

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

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

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

规则

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

  • 成员声明。 必须声明结构的每个成员。 结构成员不能为 ProtectedProtected Friend,因为没有什么可以从结构继承。 但是,结构本身可以是 ProtectedProtected Friend

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

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

  • 继承。 结构不能从 ValueType 以外的任何类型继承,所有结构都从该类型继承。 特别是,一个结构不能从另一个结构继承。

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

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

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

行为

  • 访问级别。 在一个结构中,你可以使用每个成员自己的访问级别来声明每个成员。 所有结构成员都默认具有 Public 访问权限。 请注意,如果结构本身具有限制更严格的访问级别,这会自动限制对其成员的访问,即使你使用访问修饰符调整其访问级别也是如此。

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

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

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

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

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

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

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

    如果嵌套结构内的代码对编程元素进行非限定引用,Visual Basic 会首先在嵌套结构中搜索元素,然后在其包含结构中搜索,依次搜索到最外层的包含元素。 有关详细信息,请参阅 References to Declared Elements

  • 内存消耗。 与所有复合数据类型一样,不能通过将其成员的标称存储分配相加来安全地计算结构的总内存消耗量。 而且,不能安全地假设内存中的存储顺序与声明顺序相同。 如果需要控制结构的存储布局,可以将 StructLayoutAttribute 属性应用于 Structure 语句。

示例

下面的示例使用 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

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

另请参阅