Compartilhado (Visual Basic)

Especifica que um ou mais elementos de programação declarados estão associados a uma classe ou estrutura em geral e não a uma instância específica da classe ou estrutura.

Quando usar compartilhado

Compartilhar um membro de uma classe ou estrutura o disponibiliza para cada instância, em vez de não compartilhado, em que cada instância mantém a própria cópia. O compartilhamento será útil, por exemplo, se o valor de uma variável se aplicar a todo o aplicativo. Se você declarar essa variável como sendo Shared, todas as instâncias acessarão o mesmo local de armazenamento e, se uma instância alterar o valor da variável, todas as instâncias acessarão o valor atualizado.

O compartilhamento não altera o nível de acesso de um membro. Por exemplo, um membro de classe pode ser compartilhado e particular (acessível somente de dentro da classe) ou não compartilhado e público. Para obter mais informações, consulte Níveis de acesso no Visual Basic.

Regras

  • Contexto da declaração. Você só pode usar Shared no nível do módulo. Isso significa que o contexto de declaração de um elemento Shared precisa ser uma classe ou uma estrutura, e não pode ser um arquivo de origem, namespace ou procedimento.

  • Modificadores combinados. Você não pode especificar Shared junto com Overrides, Overridable, NotOverridable, MustOverride ou Static na mesma declaração.

  • Acesso. Você acessa um elemento compartilhado qualificando-o com a classe ou o nome de estrutura, não com o nome variável de uma instância específica da classe ou estrutura. Você nem precisa criar uma instância de uma classe ou estrutura para acessar os membros compartilhados.

    O exemplo a seguir chama o procedimento IsNaN compartilhado exposto pela estrutura Double.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Compartilhamento implícito. Você não pode usar o modificador Shared em uma Instrução Const, mas as constantes são compartilhadas implicitamente. Da mesma forma, você não pode declarar um membro de um módulo ou uma interface para ser Shared, mas eles são implicitamente compartilhados.

Comportamento

  • Armazenamento. Uma variável ou evento compartilhado é armazenado na memória apenas uma vez, não importa quantas instâncias você crie da classe ou estrutura. Da mesma forma, um procedimento ou uma propriedade compartilhada contém apenas um conjunto de variáveis locais.

  • Acessando por meio de uma variável de instância. É possível acessar um elemento compartilhado qualificando-o com o nome de uma variável que contém uma instância específica da classe ou estrutura. Embora isso geralmente funcione conforme o esperado, o compilador gera uma mensagem de aviso e faz o acesso por meio da classe ou do nome da estrutura em vez da variável.

  • Acessando por meio de uma expressão de instância. Se você acessar um elemento compartilhado por meio de uma expressão que retorna uma instância da classe ou estrutura dela, o compilador fará o acesso por meio da classe ou do nome da estrutura em vez de avaliar a expressão. Esse acesso produzirá resultados inesperados se você pretender que a expressão execute outras ações, bem como retornar a instância. O exemplo a seguir ilustra essa situação.

    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
    

    No exemplo anterior, o compilador gera uma mensagem de aviso nas duas vezes em que o código acessa a propriedade Total compartilhada por meio de uma instância. Em cada caso, ele faz o acesso diretamente por meio da classe ShareTotal e não usa nenhuma instância. No caso da chamada pretendida para o procedimento ReturnClass, isso significa que ele nem mesmo gera uma chamada para ReturnClass, portanto, a ação adicional de exibição "Function ReturnClass() called" não é executada.

O modificador Shared pode ser usado nestes contextos:

Confira também