This documentation is archived and is not being maintained.

Structure Statement

Used at module or class level to declare a structure and define the characteristics of its members.

[ <attrlist> ] [{ Public | Protected | Friend | Protected Friend | Private }] [ Shadows ] 
Structure name
   [ Implements interfacenames ]
   [ proceduredeclarations ]
End Structure


Optional. List of attributes that apply to this structure. Multiple attributes are separated by commas.
Optional. Structures declared with the Public keyword have public access. There are no restrictions on the accessibility of public structures.
Optional. Structures declared with the Protected keyword have protected access. They are accessible only from within their own class or from a derived class. Protected access can be specified only on members of classes. It is not a superset of friend access.
Optional. Structures declared with the Friend keyword have friend access. They are accessible from within their declaration context and from anywhere else in the same program.
Protected Friend
Optional. Structures declared with the Protected Friend modifiers have the union of protected and friend access. They can be used by code in the same program, as well as by code in derived classes. Protected friend access can be specified only on members of classes.
Optional. Structures declared with the Private modifier have private access. They are accessible only from within their declaration context, including from members of any nested types such as procedures.
Optional. Indicates that this structure shadows an identically named programming element, or set of overloaded elements, in a base class. You can shadow any kind of declared element with any other kind. A shadowed element is unavailable from within the derived class that shadows it, unless the shadowing element is inaccessible, for example if it is Private.
Required. Name of the structure. Must be a valid Visual Basic identifier.
Optional. Indicates that this structure implements the members of one or more interfaces.
Required if the Implements statement is used. The names of the interfaces implemented by this structure. If you use the Implements statement, it must immediately follow the Structure statement, and you must implement every member defined by every interface you specify.
Required. One or more Dim, Event, Friend, Private, or Public statements declaring variables and events that serve as data members of the structure. These declarations follow the same rules as they do outside of a structure.

You can also define constants and properties in the structure, but you must declare at least one nonshared variable or event.

Optional. Zero or more declarations of Function, Property, or Sub procedures that serve as method members of the structure. These declarations follow the same rules as they do outside of a structure.

Each attribute in the attrlist part has the following syntax and parts:

attrname [({ attrargs | attrinit })]

attrlist Parts

Required. Name of the attribute. Must be a valid Visual Basic identifier.
Optional. List of positional arguments for this attribute. Multiple arguments are separated by commas.
Optional. List of field or property initializers for this attribute. Multiple initializers are separated by commas.


The Structure statement can appear only at module, namespace, or file level. This means you can declare structures in a source file or inside a module, interface, or class, but not inside a procedure. You can also define one structure inside another, but you cannot access its members through the outer structure. Instead, you must declare a variable of the inner structure's data type.

Structures can be accessed from anywhere within the module or class in which they are declared. A structure is Friend by default. To specify the accessibility in more detail, include Public, Protected, Friend, Protected Friend, or Private in the Structure statement.

You must declare every data member of a structure. This means every statement in the variabledeclarations part must use Dim, Friend, Private, or Public. A structure member cannot be Protected or Protected Friend because nothing can inherit from a structure. The structure itself, however, can be Protected or Protected Friend.

If Option Strict is On, you must also include the As clause in every member declaration. Members declared with Dim default to Public access, and members declared without the As clause default to the Object data type.

You must define at least one nonshared variable or event in a structure. You cannot have only constants, properties, and procedures, even if some of them are nonshared.

The scope of every structure member is the entire structure.

You cannot initialize the value of any data member of a structure as part of its declaration. You must either initialize a data member by means of a parameterized constructor on the structure, or assign a value to the member after you have created an instance of the structure.

Structures support many of the same features as classes. For example, structures can have properties and methods, they can implement interfaces, and they can have parameterized constructors. However, there are significant differences between structures and classes in areas such as inheritance, declarations, and usage.


This example uses the Structure statement to define a set of related data for an employee. It shows the use of Public, Friend, and Private members to reflect the sensitivity of the data items. It also shows procedure, property, and event members.

Public Structure Employee
   ' Public members, accessible throughout declaration region.
   Public FirstName As String
   Public MiddleName As String
   Public LastName As String
   ' Friend members, accessible anywhere within the same program.
   Friend EmployeeNumber As Integer
   Friend WorkPhone As Long
   ' Private members, accessible only 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
         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

See Also

Dim Statement | Implements Statement | Structures and Classes | Event Statement | Property Statement