Оператор Dim (Visual Basic)

Объявляет и выделяет место для одной или нескольких переменных.

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ] 
Dim [ WithEvents ] variablelist

Части

Термин

Определение

attributelist

Необязательный. См. Список атрибутов.

accessmodifier

Необязательный. Может принимать следующие значения:

См. раздел Уровни доступа в Visual Basic.

Shared

Необязательный. См. раздел Shared.

Shadows

Необязательный. См. раздел Shadows.

Static

Необязательный. См. раздел Static.

ReadOnly

Необязательный. См. раздел ReadOnly.

WithEvents

Необязательный. Указывает на принадлежность к переменным объектов, ссылающимся на экземпляры класса, который может порождать события. См. раздел WithEvents.

variablelist

Обязательный. Список переменных, объявляемых в этом операторе.

variable [ , variable ... ]

Каждая процедура variable имеет следующий синтаксис и составляющие:

variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With { [ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

КомпонентОписание
variablename Обязательный.Имя переменной.См. раздел Имена объявленных типов (Visual Basic).
boundslist Необязательный.Список границ каждой размерности переменной типа массив.
New Необязательный.Создает новый экземпляр класса при выполнении оператора Dim.
datatype Необязательный.Тип данных переменной.
With Необязательный.Введение в список инициализаторов объекта.
propertyname Необязательный.Имя свойства в классе при создании экземпляра.
propinitializer Требуется после propertyname =.Выражение, которое вычисляется и присваивается имени свойства.
initializer Не обязательно, если New не указан.Выражение, вычисляемое и присваиваемое переменной при ее создании.

Заметки

Компилятор Visual Basic использует операторDim для определения типа данных переменной и другой информации, например, какой код может получить доступ к переменной. В следующем примере объявляется переменная для хранения значений Integer.

Dim numberOfStudents As Integer

Можно указать любой тип данных или имя перечисления, структуры, класса или интерфейса.

Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form

Для ссылочного типа используется ключевое слово New, чтобы создать новый экземпляр класса или структуры, определяемой типом данных. Если используется New, не следует использовать выражение инициализатора. Вместо этого передайте конструктору класса все необходимые аргументы, на основе которых создается переменная.

Dim bottomLabel As New System.Windows.Forms.Label

Переменную можно объявить в процедуре, блоке, классе, структуре или модуле. Нельзя объявить переменную в исходном файле, пространстве имен или интерфейсе. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию (Visual Basic).

Переменная, которая объявляется на уровне модуля, вне любой процедуры, представляет собой переменную-член или поле . Переменные-члены находятся в области действия всего класса, структуры или модуля. Локальная переменная — это переменная, объявленная на уровне процедуры. Локальные переменные находятся в области действия только в процедурах или блоках.

Следующие модификаторы доступа используются для объявления переменных вне процедуры: Public Protected, Friend, Protected Friend и Private. Дополнительные сведения см. в разделе Уровни доступа в Visual Basic.

Ключевое слово Dim не обязательно и обычно опускается, если указан один из следующих модификаторов: Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly или WithEvents.

Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

Если Option Explicit установлен в On (по умолчанию), компилятор требует объявления для каждой используемой переменной. Дополнительные сведения см. в разделе Оператор Option Explicit (Visual Basic).

Задание начального значения

После создания переменной можно присвоить значение. Для типа значения используется инициализатор, чтобы указать выражение, которое будут присвоено переменной. Выражение должно быть константой, которая может быть вычислена во время компиляции.

Dim quantity As Integer = 10
Dim message As String = "Just started"

Если указан инициализатор и тип данных не указан в предложенииAs ,определение типа используется для определения типа данных из инициализатора. В следующем примере и num1, и num2 имеют тип целых чисел. Во втором объявлении определение типа берет тип из значения 3.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

Определение типа происходит на уровне процедур. Он не применяется вне процедуры в классе, структуре, модуле или интерфейсе. Дополнительные сведения об определении типа см. в разделах Оператор Option Infer и Вывод локального типа (Visual Basic).

Для информации о том, что происходит, когда не указан тип данных или инициализатор, смотрите Значения и типы данных по умолчанию в этом разделе.

Инициализатора объекта можно использовать для объявления экземпляров именованных и анонимных типов. В следующем примере представлено создание экземпляра класса Student и использование инициализатора объекта для инициализации свойств.

Dim student1 As New Student With {.First = "Michael", 
                                  .Last = "Tucker"}

Дополнительные сведения об инициализаторах объектов см. в разделах Практическое руководство. Объявление объекта с помощью инициализатора объектов (Visual Basic), Инициализаторы объектов: именованные и анонимные типы (Visual Basic) и Анонимные типы (Visual Basic).

Объявление нескольких переменных

Можно объявить несколько переменных в одном операторе объявления, указав имя переменной для каждого из них и имя массива с круглыми скобками. Несколько переменных разделяются запятыми.

Dim lastTime, nextTime, allTimes() As Date

При объявлении нескольких переменных с помощью общего предложения As не допускается использовать инициализатор для этой группы переменных.

Можно указать различные типы данных для переменных с помощью отдельных предложений As для каждой объявляемой переменной. Тип каждой переменной указывается в первом предложении As, следующем за элементом variablename этой переменной.

Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double

Массивы

Пользователь может объявить переменную для хранения массива, который может содержать несколько значений. Чтобы указать, что переменная содержит массив, поставьте скобки непосредственно после variablename. Дополнительные сведения о массивах см. в разделе Массивы в Visual Basic.

Пользователь может указать нижнюю и верхнюю границы каждой размерности массива. Чтобы сделать это, включите в скобки параметр boundslist. Для каждого измерения boundslist задает верхнюю границу и при необходимости нижнюю границу. Нижняя граница всегда равна нулю, вне зависимости от того, определена она или нет. Каждый индекс может изменяться от нуля до значений верхней границы.

Следующие две инструкции эквивалентны. Каждый оператор объявляет массив из 21 элемента Integer. При доступе к массиву индекс может изменяться от 0 до 20.

Dim totals(20) As Integer
Dim totals(0 To 20) As Integer

Следующий оператор объявляет двумерный массив типа Double. Массив имеет 4 строки (3 + 1) по 6 столбцов (5 + 1) каждая. Обратите внимание, что верхняя граница представляет наибольшее возможное значение для этого индекса, но не длину размерности. Длина измерения — верхняя граница плюс один.

Dim matrix2(3, 5) As Double

Массив может иметь от 1 до 32 размерностей.

Пользователь может оставить все границы пустыми в объявлении массива. В этом случае массив будет имеет указанную размерность, но не будет инициализирован. Он имеет значение Nothing до тех пор, пока не инициализирована по крайней мере часть его элементов. В операторе Dim необходимо указать границы либо для всех размерностей, либо ни для одной из них.

' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

Если массив имеет более чем одну размерность, необходимо включить запятые между круглыми скобками, чтобы указать число размерностей.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

Можно объявить массив нулевой длины, объявив одним из измерений массива -1. Переменная, содержащая массив нулевой длины, не имеет значения Nothing. Массивы нулевой длины требуются некоторым функциям среды CRL. При попытке доступа к такому массиву возникает исключение во время выполнения. Дополнительные сведения см. в разделе Массивы в Visual Basic.

Можно инициализировать значения массива с помощью литерала массива. Чтобы сделать это, окружите значения инициализации фигурными скобками ({}).

Dim longArray() As Long = {0, 1, 2, 3}

Для многомерных массивов инициализация для каждой отдельной размерности заключается в фигурные скобки внешней размерности. Элементы массивов задаются по строкам.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Дополнительные сведения о литералах массивов см. в разделе Массивы в Visual Basic.

Значения и типы данных по умолчанию

В следующей таблице описаны результаты различных комбинаций указания типа данных и инициализации в оператореDim .

Указан тип данных?

Инициализатор указан?

Пример

Результат

Нет

Нет

Dim qty

Если Option Strict имеет значение Off (значение по умолчанию), переменной задается значение Nothing.

Если Option Strict равен On, то во время компиляции возникает ошибка.

Нет

Да

Dim qty = 5

Если Option Infer имеет значение On (значение по умолчанию), переменная получает тип данных от инициализатора. См. раздел Вывод локального типа (Visual Basic).

Если Option Infer — Off и Option Strict — Off, переменная получает тип данных от Object.

Если Option Infer равен Off, а Option Strict равен On, то во время компиляции возникает ошибка.

Да

Нет

Dim qty As Integer

Переменная инициализируется со значением по умолчанию для типа данных. См. таблицу далее в этом разделе.

Да

Да

Dim qty As Integer = 5

Если тип данных инициализатора не преобразовать в указанный тип данных, то во время компиляции возникает ошибка.

Если указывается тип данных, но не указывается инициализатор, Visual Basic инициализирует его значением по умолчанию для его типа данных. В следующей таблице показаны значения инициализации по умолчанию .

Тип данных

Значение по умолчанию

Все числовые типы (включая Byte и SByte)

0

Char

Двоичный 0

Все ссылочные типы (включая Object, String и все массивы)

Nothing

Boolean

False

Date

12 ч 00 мин 1 января 1 г. (01/01/0001 12:00:00)

Каждый элемент структуры или массива инициализируется так, как если бы он был отдельной переменной. Если объявляется длина массива, но не инициализируются его элементы, каждый элемент инициализируется, как если бы он был отдельной переменной.

Время существования статической локальной переменной

Локальные переменные Static существуют дольше процедуры, в которой они объявляются. Пределы существования переменной зависят от места объявления процедуры и от использования элемента Shared в операторе объявления.

Объявление процедуры

Переменная инициализируется

Переменная прекращает существование

В модуле

При первом вызове процедуры

Когда программа завершает выполнение

В классе или структуре Shared

При первом вызове процедуры на определенном экземпляре или на классе или структуре самой процедуры

Когда программа завершает выполнение

В классе или структуре, которая не является Shared

При первом вызове процедуры на определенном экземпляре

Когда экземпляр освобождается для сборки мусора

Атрибуты и модификаторы

Пользователь может применить атрибуты только для переменных-членов, но не для локальных переменных. Атрибут вносит сведения для метаданных сборки, которые не имеют смысла при временном хранения таких переменных как локальные.

На уровне модуля нельзя использовать модификатор Static для объявления переменных-членов. На уровне процедуры нельзя использовать Shared, Shadows ReadOnly, WithEvents, а также любые модификаторы доступа для объявления локальных переменных.

Пользователь может указать, какой код может получить доступ к переменной, указав accessmodifier. Переменные-члены класса и модуля (вне любых процедур) по умолчанию имеют закрытый доступ, а переменные-члены структуры по умолчанию имеют общий доступ. Уровни доступа можно настроить с помощью модификаторов доступа. Нельзя использовать модификаторы доступа для локальных переменных (внутри процедуры).

Пользователь может указать WithEvents только для переменных-членов, но не для локальных переменных внутри процедуры. Если указать WithEvents, типом данных переменной должен быть определенный тип класса, а не Object. Нельзя объявлять массив с WithEvents. Дополнительные сведения о событиях см. в разделе События (Visual Basic).

Примечание

Код вне класса, модуля или структуры необходимо определять именем переменной-члена с именем этого класса, структуры или модуля.Код за пределами процедуры или блока не может ссылаться на любые локальные переменные в пределах этой процедуры или блока.

Пример

В следующем примере переменные объявляются с помощью оператора Dim с различными параметрами.

' Declare and initialize a Long variable.
Dim startingAmount As Long = 500

' Declare a variable that refers to a Button object,
' create a Button object, and assign the Button object
' to the variable.
Dim switchButton As New System.Windows.Forms.Button

' Declare a local variable that always retains its value,
' even after its procedure returns to the calling code.
Static totalSales As Double

' Declare a variable that refers to an array.
Dim highTemperature(31) As Integer

' Declare and initialize an array variable that
' holds four Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

В следующем примере выводится список простых чисел между 1 и 30. Область локальных переменных описывается в комментариях кода.

Public Sub ListPrimes()
    ' The sb variable can be accessed only
    ' within the ListPrimes procedure.
    Dim sb As New System.Text.StringBuilder()

    ' The number variable can be accessed only
    ' within the For...Next block.  A different
    ' variable with the same name could be declared
    ' outside of the For...Next block.
    For number As Integer = 1 To 30
        If CheckIfPrime(number) = True Then
            sb.Append(number.ToString & " ")
        End If
    Next

    Debug.WriteLine(sb.ToString)
    ' Output: 2 3 5 7 11 13 17 19 23 29
End Sub


Private Function CheckIfPrime(ByVal number As Integer) As Boolean
    If number < 2 Then
        Return False
    Else
        ' The root and highCheck variables can be accessed
        ' only within the Else block.  Different variables
        ' with the same names could be declared outside of
        ' the Else block.
        Dim root As Double = Math.Sqrt(number)
        Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

        ' The div variable can be accessed only within
        ' the For...Next block.
        For div As Integer = 2 To highCheck
            If number Mod div = 0 Then
                Return False
            End If
        Next

        Return True
    End If
End Function

В следующем примере переменная speedValue объявлена на уровне класса. Ключевое слово Private используется для объявления переменной. Переменную может получить любая процедура в классеCar .

' Create a new instance of a Car.
Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
    ' The speedValue variable can be accessed by
    ' any procedure in the Car class.
    Private speedValue As Integer = 0

    Public ReadOnly Property Speed() As Integer
        Get
            Return speedValue
        End Get
    End Property

    Public Sub Accelerate(ByVal speedIncrease As Integer)
        speedValue += speedIncrease
    End Sub
End Class

См. также

Задачи

Практическое руководство. Объявление экземпляра анонимного типа (Visual Basic)

Практическое руководство. Объявление объекта с помощью инициализатора объектов (Visual Basic)

Ссылки

Оператор Const (Visual Basic)

Оператор ReDim (Visual Basic)

Оператор Option Explicit (Visual Basic)

Оператор Option Infer

Оператор Option Strict

Страница "Компиляция" в конструкторе проектов (Visual Basic)

Основные понятия

Объявление переменной в Visual Basic

Массивы в Visual Basic

Инициализаторы объектов: именованные и анонимные типы (Visual Basic)

Анонимные типы (Visual Basic)

Инициализаторы объектов: именованные и анонимные типы (Visual Basic)

Вывод локального типа (Visual Basic)

Журнал изменений

Дата

Журнал

Причина

Январь 2011

Реорганизованы замечания, добавлены примеры, сделаны другие изменения.

Улучшение информации.