-
Structure 语句
声明结构的名称,并引入结构包含的变量、属性、事件和过程的定义。
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _
Structure name [ ( Of typelist ) ]
[ Implements interfacenames ]
datamemberdeclarations
[ methodmemberdeclarations ]
End Structure
部件
术语 |
定义 |
attributelist |
可选。 请参见特性列表。 |
accessmodifier |
可选。 可以是如下内容之一:
请参见Visual Basic 中的访问级别。 |
Shadows |
可选。 请参见 Shadows。 |
Partial |
可选。 指示结构的分部定义。 请参见分部 (Visual Basic)。 |
name |
必选。 此结构的名称。 请参见已声明的元素名称 (Visual Basic)。 |
Of |
可选。 指定这是一个泛型结构。 |
typelist |
如果使用 Of 关键字,则为必选项。 此结构的类型参数列表。 请参见类型列表。 |
Implements |
可选。 指示此结构实现一个或多个接口成员。 请参见Implements 语句。 |
interfacenames |
如果使用 Implements 语句,则为必选项。 此结构实现的接口的名称。 |
datamemberdeclarations |
必选。 一个或多个 Const、Dim、Enum 或 Event 语句,声明结构的数据成员。 |
methodmemberdeclarations |
可选。 作为结构的方法成员的零个或多个 Function、Operator、Property 或 Sub 过程的声明。 |
End Structure |
必选。 终止 Structure 定义。 |
备注
Structure 语句定义一种您可以自定义的复合值类型。 “结构”是 Visual Basic 早期版本的用户定义类型 (UDT) 的泛化。 有关更多信息,请参见 结构 (Visual Basic)。
结构支持的许多功能与类支持的一样。 例如,结构可以拥有属性和过程,可以实现接口,也可以拥有参数化的构造函数。 但是,在某些地方(例如继承、声明和用法)结构和类之间存在着重大的差异。 而且,类是引用类型,而结构是值类型。 有关更多信息,请参见 结构和类 (Visual Basic)。
您只能在命名空间或模块级别使用 Structure。 这意味着结构的声明上下文必须是源文件、命名空间、类、结构、模块或接口,不能是过程或块。 有关更多信息,请参见声明上下文和默认访问级别 (Visual Basic)。
结构默认为 Friend (Visual Basic) 访问级别。 可以使用访问修饰符来调整它们的访问级别。 有关更多信息,请参见 Visual Basic 中的访问级别。
规则
-
**嵌套。**可以在一个结构中定义另一个结构。 外部结构称为“包含结构”,而内部结构称为“嵌套结构”。 但是,无法通过包含结构来访问嵌套结构的成员, 而是必须声明一个嵌套结构的数据类型的变量。
-
**成员声明。**必须声明结构的每个成员。 由于无法从结构中继承任何内容,因此结构成员不能是 Protected 或 Protected Friend。 但是,结构本身可以是 Protected 或 Protected Friend。
必须在结构中声明至少一个非共享的变量或非共享、非自定义的事件。 在结构中不能只包含常数、属性和过程,即使某些成员是非共享的。
-
**初始化。**不能将结构的任何非共享数据成员的值初始化成其声明的一部分。 必须通过结构上参数化的构造函数初始化此类数据成员,或者在创建了该结构的实例后将值赋给该成员。
-
**继承。**结构无法从除 ValueType(所有结构均从它继承)外的任何类型继承。 特别地,一个结构无法从另一个结构继承。
无法在结构定义中使用 Inherits 语句,即使是指定 ValueType 亦为如此。
-
**实现。**如果结构使用 Implements 语句,则必须实现您在 interfacenames 中指定的每个接口所定义的每个成员。
-
**默认属性。**一个结构至多可以指定一个属性作为其默认属性(通过使用 Default (Visual Basic) 修饰符)。 有关更多信息,请参见 Default (Visual Basic)。
行为
-
**访问级别。**在结构中,可以利用成员自己的访问级别来声明每个成员。 所有结构成员均默认为 Public (Visual Basic) 访问级别。 请注意,如果结构本身具有限制性更高的访问级别,这会自动限制对其成员的访问,即使您使用访问修饰符来调整其成员的访问级别也是如此。
-
**范围。**结构的范围贯穿它的包含命名空间、类、结构或模块。
结构成员的范围是整个结构。
-
**生存期。**结构本身没有生存期。 相反,结构的每个实例具有独立于所有其他实例的生存期。
实例的生存期在它由 New 运算符 (Visual Basic) 子句创建时开始, 并在保存实例的变量的生存期结束时结束。
无法延长结构实例的生存期。 模块提供了近似的静态结构功能。 有关更多信息,请参见 Module 语句。
结构成员具有由如何以及在哪里声明它们决定的生存期。 有关更多信息,请参见Class 语句 (Visual Basic) 中的“生存期”。
-
**限定。**结构外的代码必须用结构的名称来限定成员的名称。
如果嵌套结构外的代码以非限定的方式引用某个编程元素,则 Visual Basic 会按此顺序搜索该元素:先在嵌套结构中搜索,然后在其包含结构中搜索,依此类推,一直到最外部的包含元素。 有关更多信息,请参见 对已声明元素的引用 (Visual Basic)。
-
**内存消耗。**与所有的复合数据类型一样,您无法通过将结构成员的名义存储分配相加来得到确切的总内存消耗。 此外,不能完全假定成员在内存中的存储顺序与声明的顺序相同。 如果需要控制结构的存储布局,可以对 Structure 语句应用 StructLayoutAttribute 特性。
示例
下面的示例使用 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