Оператор 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
, , Friend
Protected Friend
и Private
. Дополнительные сведения см. в разделе "Уровни доступа" в Visual Basic.
Dim
Ключевое слово является необязательным и обычно опущен, если указан любой из следующих модификаторов: Public
, Protected
, Shared
Protected Friend
Friend
Shadows
Static
Private
ReadOnly
или .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 |
Все ссылочные типы (включая Object String и все массивы) |
Nothing |
Boolean |
False |
Date |
12:00 1 января 1 года (01.01.001.001 12:00:00) |
Каждый элемент структуры инициализирован, как если бы он был отдельной переменной. Если вы объявляете длину массива, но не инициализируете его элементы, каждый элемент инициализируется так, как если бы он был отдельной переменной.
Время существования статических локальных переменных
Локальная Static
переменная имеет больше времени существования, чем процедура, в которой она объявлена. Границы времени существования переменной зависят от того, где объявлена процедура и является ли она Shared
.
Объявление процедуры | Переменная инициализирована | Переменная останавливает существующую |
---|---|---|
В модуле | При первом вызове процедуры | После остановки выполнения программы |
Процедура в классе или структуре Shared |
При первом вызове процедуры в определенном экземпляре или в самом классе или структуре | После остановки выполнения программы |
В классе или структуре процедура не является Shared |
При первом вызове процедуры для определенного экземпляра | Когда экземпляр освобождается для сборки мусора (GC) |
Атрибуты и модификаторы
Атрибуты можно применять только к переменным-членам, а не к локальным переменным. Атрибут вносит сведения в метаданные сборки, которые не имеют значения для временного хранилища, например локальных переменных.
На уровне модуля модификатор нельзя использовать Static
для объявления переменных-членов. На уровне процедуры нельзя использовать Shared
модификаторы WithEvents
Shadows
ReadOnly
доступа или модификаторы доступа для объявления локальных переменных.
Можно указать, какой код может получить доступ к переменной, указав объект 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
См. также
- Оператор Const
- Оператор reDim
- Оператор Option Explicit
- Оператор Option Infer
- Оператор Option Strict
- Страница "Компиляция" в конструкторе проектов (Visual Basic)
- Объявление переменной
- Массивы
- Инициализаторы объектов. Именованные и анонимные типы
- Анонимные типы
- Инициализаторы объектов. Именованные и анонимные типы
- Практическое руководство. Объявление объекта с помощью инициализатора объектов
- Вывод локального типа