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 elementoShared
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 comeShared
, 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 classeShareTotal
e non usa alcuna istanza. Nel caso della chiamata prevista alla routineReturnClass
, ciò significa che non genera nemmeno una chiamata aReturnClass
, quindi l'azione aggiuntiva di visualizzazione di "Function ReturnClass() called" non viene eseguita.
Il modificatore Shared
può essere usato nei contesti seguenti:
- Istruzione Dim
- Istruzione Event
- Istruzione Function
- Istruzione Operator
- Istruzione Property
- Istruzione Sub