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

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

Синтаксис

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

Детали

  • attributelist

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

  • accessmodifier

    Необязательно. Может применяться один из перечисленных ниже типов.

    См. раздел Access levels in Visual Basic.

  • Shared

    Необязательно. См . раздел "Общий доступ".

  • Shadows

    Необязательно. См . тени.

  • Static

    Необязательно. См . статический раздел.

  • ReadOnly

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

  • WithEvents

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

  • variablelist

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

    variable [ , variable ... ]

    Каждый элемент variable имеет перечисленные ниже синтаксис и компоненты.

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

    Часть Description
    variablename Обязательное. Имя переменной. См. раздел Declared Element Names.
    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

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

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

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

Dim Ключевое слово является необязательным и обычно опущен, если указан любой из следующих модификаторов: Public, Protected, SharedProtected FriendFriendShadowsStaticPrivateReadOnlyили .WithEvents

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

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

Указание начального значения

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

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

Вывод типа применяется на уровне процедуры. Она не применяется вне процедуры в классе, структуре, модуле или интерфейсе. Дополнительные сведения о выводе типов см. в разделе "Оператор вывода параметров" и "Вывод локальных типов".

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

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

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

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

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

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

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 скобками. Дополнительные сведения см. в руководстве по работе с массивами.

Можно указать нижнюю и верхнюю границу каждого измерения массива. Для этого включите 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. Массивы нулевой длины требуются определенными функциями среды CLR. При попытке получить доступ к такому массиву возникает исключение среды выполнения. Дополнительные сведения см. в статье Arrays (C++/CLI and C++/CX) (Массивы (C++/CLI и C++/CX)).

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

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

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

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

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

Типы и значения данных по умолчанию

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

Указан тип данных? Указан инициализатор? Пример Результат
No No Dim qty Если параметр "Строгий " отключен (по умолчанию), переменная имеет Nothingзначение .

Если параметр Option Strict включен, возникает ошибка времени при компиляции.
No Да Dim qty = 5 Если параметр "Вывод " включен (по умолчанию), переменная принимает тип данных инициализатора. См . вывод локальных типов.

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

Если параметр Option Infer отключен, а параметр Option Strict включен, возникает ошибка времени компиляции.
Да Нет Dim qty As Integer Переменная инициализируется со значением по умолчанию для типа данных. См. таблицу далее в этом разделе.
Да Да Dim qty As Integer = 5 Если тип данных инициализатора нельзя преобразовать в указанный тип данных, возникает ошибка времени компиляции.

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

Тип данных Default value
Все числовые типы (включая Byte и SByte) 0
Char Двоичный 0
Все ссылочные типы (включая ObjectStringи все массивы) Nothing
Boolean False
Date 12:00 1 января 1 года (01.01.001.001 12:00:00)

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

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

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

Объявление процедуры Переменная инициализирована Переменная останавливает существующую
В модуле При первом вызове процедуры После остановки выполнения программы
Процедура в классе или структуре Shared При первом вызове процедуры в определенном экземпляре или в самом классе или структуре После остановки выполнения программы
В классе или структуре процедура не является Shared При первом вызове процедуры для определенного экземпляра Когда экземпляр освобождается для сборки мусора (GC)

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

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

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

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

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

Примечание.

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

Освобождение управляемых ресурсов

Сборщик мусора платформа .NET Framework удаляет управляемые ресурсы без дополнительного кода. Однако вы можете принудительно удалить управляемый ресурс вместо ожидания сборщика мусора.

Если класс держится на особенно ценном и дефицитном ресурсе (например, подключении к базе данных или дескрипторе файла), может не потребоваться ждать, пока следующая сборка мусора не будет очищать экземпляр класса, который больше не используется. Класс может реализовать IDisposable интерфейс, чтобы предоставить способ освобождения ресурсов перед сборкой мусора. Класс, реализующий этот интерфейс, предоставляет Dispose метод, который можно вызвать, чтобы принудительно освободить ценные ресурсы немедленно.

Инструкция Using автоматизирует процесс получения ресурса, выполнения набора инструкций и последующего удаления ресурса. Однако ресурс должен реализовать IDisposable интерфейс. Дополнительные сведения см. в разделе Оператор using.

Пример 1

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

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

' 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}

Пример 2

В следующем примере перечислены простые числа от 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

Пример 3

В следующем примере 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

См. также