Shared (Visual Basic)

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

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

Заметки

Когда следует использовать Shared

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

Совместное использование не изменяет уровень доступа для члена. Например, член класса может использоваться совместно и закрытым образом (только в пределах класса) или несовместно и открыто. Дополнительные сведения см. в разделе Уровни доступа в Visual Basic.

Правила

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

  • Комбинированные модификаторы. Не допускается указание в одном объявлении ключевого слова Shared совместно с Overrides, Overridable, NotOverridable, MustOverride или Static (Visual Basic).

  • Доступ. Доступ к совместно используемому элементу может осуществляться путем указания вместе с ним имени класса или структуры, но не имени переменной экземпляра класса или структуры. Нет необходимости создавать экземпляр класса или структуры для доступа к их общим членам.

    В следующем примере вызывается совместно используемая процедура IsNaN, представленная структурой Double.

    If Double.IsNaN(result) Then MsgBox("Result is mathematically undefined.")

  • Неявное совместное использование данных. Нельзя использовать модификатор Shared в Оператор Const (Visual Basic), но константы неявно являются общими. Аналогично, нельзя объявлять член модуля или интерфейса как Shared, но они являются общими неявно.

Поведение

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

  • Доступ через переменную экземпляра. Доступ к совместно используемому элементу может осуществляться путем указания вместе с ним имени переменной, которая содержит экземпляр класса или структуры. Хотя, обычно это работает как ожидается, компилятор создает предупреждающее сообщение, и доступ производится с помощью имени класса или структуры, а не переменной.

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

    Sub main()
        shareTotal.total = 10
        ' The preceding line is the preferred way to access total.
        Dim instanceVar As New shareTotal
        instanceVar.total += 100
        ' The preceding line generates a compiler warning message and
        ' accesses total through class shareTotal instead of through
        ' the variable instanceVar. This works as expected and adds
        ' 100 to total.
        returnClass().total += 1000
        ' The preceding line generates a compiler warning message and
        ' accesses total through class shareTotal instead of calling
        ' returnClass(). This adds 1000 to total but does not work as
        ' expected, because the MsgBox in returnClass() does not run.
        MsgBox("Value of total is " & CStr(shareTotal.total))
    End Sub
    Public Function returnClass() As shareTotal
        MsgBox("Function returnClass() called")
        Return New shareTotal
    End Function
    Public Class shareTotal
        Public Shared total As Integer
    End Class
    

    В предыдущем примере компилятор создает предупреждение оба раза, когда код обращается к общей переменной total через экземпляр. В каждом случае он осуществляет доступ непосредственно через класс shareTotal и не использует экземпляры. В случае предполагаемого вызова процедуры returnClass это означает, что она даже не создает вызов returnClass, то есть не выполняются дополнительные действия для отображения "Функция returnClass() вызвана".

Модификатор Shared можно использовать в следующих контекстах:

Оператор Dim

Оператор Event

Оператор Function

Оператор Operator

Оператор Property

Оператор Sub

См. также

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

Время существования в Visual Basic

Процедуры в Visual Basic

Общие члены в Visual Basic

Ссылки

Shadows

Static (Visual Basic)

Другие ресурсы

Структуры: пользовательские типы данных

Общее представление о классах