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

Обновлен: Ноябрь 2007

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

[ <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

    Обязательный параметр. Имя переменной. См. раздел Имена объявленных элементов.

    boundslist

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

    New

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

    datatype

    Обязателен, если Option Strict установлен в On. Тип данных переменной.

    With

    Необязательный атрибут. Введение в список инициализаторов объекта.

    propertyname

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

    propinitializer

    Требуется после propertyname =. Выражение, которое вычисляется и присваивается имени свойства.

    initializer

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

Заметки

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

Dim numberOfStudents As Integer

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

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

Можно указать тип данных каждой переменной в операторе Dim. Можно также указать начальное значение. Если этого не сделать, Visual Basic использует настройки по умолчанию. Дополнительные сведения содержатся в разделах "Правила типов данных" и "Значения по умолчанию" в группе "Подробные сведения" на этой странице справки. В следующем примере объявляется и инициализируется переменная String.

Dim summary As String = "Summary of results" 

Пользователь может указать код, который может получить доступ к переменной, указав accessmodifier в операторе Dim. Дополнительные сведения содержатся в разделах "Модификаторы" и "Уровень доступа" в группе "Подробные сведения" на этой странице справки.

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

Dim days() As Integer 

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

В Visual Basic 2008 представлены инициализаторы объектов, используемые для объявления экземпляров именованных и безымянных типов, а также для локального определения типов. Дополнительные сведения см. в разделах Анонимные типы, Инициализаторы объектов: именованные и анонимные типы и Вывод локального типа.

Подробные сведения

Этот раздел подробно описывает следующие области:

  • Объявление

  • Типы данных

  • Массивы

  • Поведение

  • Устранение неполадок

Правила объявления

  • Контекст объявления. Переменная, объявленная на уровне модуля вне любой процедуры представляет собой переменную-член или поле; она является членом класса, структуры или модуля, объявляющего ее.

    Объявленная на уровне процедуры переменная является локальной переменной; она является локальной для процедуры или блока, объявляющего ее.

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

  • Неявное использование оператора Dim. Если указан один из модификаторов Public, ProtectedFriend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly или WithEvents, можно опустить ключевое слово Dim.

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

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

  • Переменные WithEvents. Пользователь может указать WithEvents только для переменных-членов, но не для локальных переменных внутри процедуры.

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

    Дополнительные сведения о событиях см. в разделе События и обработчики событий.

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

    Dim lastTime, nextTime, allTimes() As Date
    

Правила типов данных

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

    Dim finished As Boolean
    Dim monitorBox As System.Windows.Forms.Form
    
  • Тип по умолчанию. Если не указан элемент datatype, переменная принимает тип данных элемента initializer. Если не присутствует ни datatype ни initializer, типом данных по умолчанию является Тип данных Object. Если задан и datatype и initializer, тип данных initializer должен быть преобразован к datatype.

  • Различные типы. Можно указать различные типы данных для переменных с помощью отдельных предложений 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
    
  • Инициализация. Оператор Dim может инициализировать содержимое выбранных переменных в variablelist. Для типа значения используется initializer, чтобы указать выражение, которое будут присвоено переменной. Выражение должно быть константой, которая может быть вычислена во время компиляции.

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

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

    Dim bottomLabel As New System.Windows.Forms.Label
    

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

Правила для массивов

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

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

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

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

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

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

    Dim messages() As String
    
  • Пустые массивы. Для объявления верхней границы размера массива можно использовать число -1. Это число указывает на то, что массив пуст, но не равен значению Nothing, подобное различие важно для некоторых функций среды CLR. В то же время в Visual Basic отсутствует возможность доступа к таким массивам. При попытке сделать это во время выполнения возникает ошибка IndexOutOfRangeException. Дополнительные сведения см. в разделе Практическое руководство. Создание массива без элементов.

  • Инициализация массива. Инициализация значений массива может выполняться путем заключения начальных значений в фигурные скобки ({}).

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

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

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

Поведение

  • Значения по умолчанию. Если для переменной не указывается значение initializer, 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

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

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

Устранение неполадок

  • Порядок выполнения. Оператор Dim сам по себе не является исполняемым оператором. Однако, если он инициализирует одну или несколько переменных, инициализации рассматриваются как операторы присваивания. Это означает, что значение переменной подвергается следующим действиям:

    1. На первом входе в элемент кода, объявляющий переменную, Visual Basic инициализирует ее значением по умолчанию для ее типа данных.

    2. Когда выполнение достигает оператора переменной Dim, Visual Basic инициализирует ее значением, указанным в операторе Dim.

    3. Всякий раз, когда выполнение достигает оператора переменной Dim, Visual Basic вновь устанавливает значение, указанное в операторе Dim.

    Последствия использования оператора Dim для инициализации переменной:

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

    • Если выполнение никогда не достигает оператора Dim, переменная никогда не инициализируется значением, указанным в операторе Dim.

    • Если изменить значение, но затем вернуться к Dim, указанное в операторе Dim значение заменит исходное.

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

Пример

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

' The following statement declares and initializes a Long variable.
Dim startingAmount As Long = 500
' The following statement declares a variable that refers to a Button 
' object, creates a new Button object, and assigns it to the variable.
Dim switchButton As New System.Windows.Forms.Button
' The following statement declares a variable that can only be 
' accessed by code in the same class, structure, or module.
Private homeTelephone As String = ""
' The following statement declares a local variable that always retains
' its value, even after its procedure returns to the calling code.
Static totalSales As Double
' The following statement declares a variable that refers to an array.
Dim highTemperature(31) As Integer
' The following statement declares and initializes an array variable 
' that holds 4 Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

См. также

Задачи

Практическое руководство. Объявление переменной типа массива

Практическое руководство. Объявление переменной типа массива

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

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

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

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

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

Анонимные типы

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

Вывод локального типа

Ссылки

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

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

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