Shared (Visual Basic)

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

Когда следует использовать общий доступ

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

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

Правила

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

  • Объединенные модификаторы. Нельзя указать Shared вместе с переопределениями, переопределениями, NotOverridable, MustOverride или Static в том же объявлении.

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

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

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Неявный общий доступ. Модификатор нельзя использовать Shared в операторе Const, но константы неявно разделяются. Аналогичным образом нельзя объявить элемент модуля или интерфейса Shared, но они неявно совместно используются.

Поведение

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

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

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

    Sub Main()
        ' The following line is the preferred way to access Total.
        ShareTotal.Total = 10
    
        ' The following 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.
        Dim instanceVar As New ShareTotal
        instanceVar.Total += 100
    
        ' The following 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 WriteLine in ReturnClass() does not run.
        Console.WriteLine("Value of total is " & CStr(ShareTotal.Total))
        ReturnClass().Total += 1000
    End Sub
    
    Public Function ReturnClass() As ShareTotal
        Console.WriteLine("Function ReturnClass() called")
        Return New ShareTotal
    End Function
    
    Public Class ShareTotal
        Public Shared Property Total As Integer
    End Class
    

    В предыдущем примере компилятор создает предупреждающее сообщение оба раза, когда код обращается к общему свойству Total через экземпляр. В каждом случае он делает доступ непосредственно через класс ShareTotal и не использует любой экземпляр. В случае предполагаемого вызова процедуры ReturnClassэто означает, что он даже не создает вызов ReturnClass, поэтому дополнительное действие отображения функции ReturnClass() не выполняется.

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

См. также