Shared (Visual Basic)

Specifica che uno o più elementi di programmazione dichiarati sono associati a una classe o a una struttura di grandi dimensioni e non a un'istanza specifica della classe o della struttura.

Quando usare il tipo condiviso

La condivisione di un membro di una classe o di una struttura lo rende disponibile per ogni istanza, contrariamente all'approccio non condiviso in cui ogni istanza mantiene la propria copia. La condivisione è utile, ad esempio, se il valore di una variabile si applica all'intera applicazione. Se si dichiara che tale variabile deve essere Shared, tutte le istanze accedono alla stessa posizione di archiviazione e, se un'istanza modifica il valore della variabile, tutte le istanze accedono al valore aggiornato.

La condivisione non modifica il livello di accesso di un membro. Ad esempio, un membro di classe può essere condiviso e privato (accessibile solo dall'interno della classe) o non condiviso e pubblico. Per ulteriori informazioni, vedere Livelli di accesso in Visual Basic.

Regole

  • Contesto della dichiarazione. Si può usare Shared solo a livello di modulo. Ciò significa che il contesto della dichiarazione per un elemento Shared deve essere una classe o una struttura e non può essere un file di origine, uno spazio dei nomi o una routine.

  • Modificatori combinati. Non è possibile specificare Shared insieme a Override, Overridable, NotOverridable, MustOverride o Static nella stessa dichiarazione.

  • Accesso in corso. È possibile accedere a un elemento condiviso qualificandolo con il nome della classe o della struttura, non con il nome della variabile di un'istanza specifica della relativa classe o struttura. Non è nemmeno necessario creare un'istanza di una classe o di una struttura per accedere ai relativi membri condivisi.

    Nell'esempio seguente viene chiamata la routine IsNaN condivisa esposta dalla struttura Double.

    If Double.IsNaN(result) Then Console.WriteLine("Result is mathematically undefined.")
    
  • Condivisione implicita. Non è possibile usare il modificatore Shared in un'istruzione Const, ma le costanti vengono condivise in modo implicito. Analogamente, non è possibile dichiarare un membro di un modulo o un'interfaccia come Shared, ma questi vengono condivisi in modo implicito.

Comportamento

  • Archiviazione. Una variabile o un evento condiviso vengono archiviati in memoria una sola volta, indipendentemente dal numero di istanze create dalla relativa classe o struttura. Analogamente, una routine o una proprietà condivisa contiene un solo set di variabili locali.

  • Accesso tramite una variabile di istanza. È possibile accedere a un elemento condiviso qualificandolo con il nome di una variabile che contiene un'istanza specifica della relativa classe o struttura. Anche se in genere funziona come previsto, il compilatore genera un messaggio di avviso e imposta l'accesso tramite la classe o il nome della struttura anziché tramite la variabile.

  • Accesso tramite un'espressione di istanza. Se si accede a un elemento condiviso tramite un'espressione che restituisce un'istanza della relativa classe o struttura, il compilatore effettua l'accesso tramite la classe o il nome della struttura anziché valutare l'espressione. Questo accesso produce risultati imprevisti se si intende che l'espressione esegua altre azioni e restituisca l'istanza. L'esempio seguente illustra questa situazione.

    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
    

    Nell'esempio precedente il compilatore genera un messaggio di avviso entrambe le volte in cui il codice accede alla proprietà condivisa Total tramite un'istanza. In ogni caso, fa sì che l'accesso avvenga direttamente tramite la classe ShareTotal e non usa alcuna istanza. Nel caso della chiamata prevista alla routine ReturnClass, ciò significa che non genera nemmeno una chiamata a ReturnClass, quindi l'azione aggiuntiva di visualizzazione di "Function ReturnClass() called" non viene eseguita.

Il modificatore Shared può essere usato nei contesti seguenti:

Vedi anche