Shared (Visual Basic)

Aggiornamento: novembre 2007

Specifica che uno o più elementi di programmazione dichiarati sono alla fine associati a una classe o a una struttura, non a una specifica istanza della classe o della struttura.

Note

Utilizzo di Shared

Quando un membro di una classe o di una struttura è condiviso, è disponibile per tutte le istanze. Quando invece non è condiviso, ogni istanza dovrà conservare la propria copia. Questa condizione risulta utile, ad esempio, se il valore di una variabile è applicabile all'intera applicazione. Se la variabile viene dichiarata Shared, tutte le istanze accederanno allo stesso percorso di archiviazione e, se per una delle istanze viene modificato il valore della variabile, tutte le istanze accederanno al valore aggiornato.

La condivisione non altera il livello di accesso di un membro. Ad esempio, un membro della 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. È possibile utilizzare Shared solo a livello di modulo. In altri termini, 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 Overrides, Overridable, NotOverridable, MustOverride o Static (Visual Basic) nella stessa dichiarazione.

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

    Nell'esempio riportato di seguito viene effettuata una chiamata alla routine condivisa IsNaN esposta dalla struttura Double.

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

  • Condivisione implicita. Non è possibile utilizzare il modificatore Shared in un'Istruzione Const (Visual Basic), ma le costanti sono condivise in modo implicito. Analogamente, non è possibile dichiarare un membro di un modulo o di un'interfaccia come Shared, ma tali elementi sono condivisi in modo implicito.

Comportamento

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

  • Accesso mediante una variabile di istanza. È possibile accedere a un elemento condiviso qualificandolo con il nome di una variabile che contiene una specifica istanza della relativa classe o struttura. Anche se in genere questo sistema funziona correttamente, il compilatore genera un messaggio di avviso ed effettua l'accesso mediante il nome della classe o della struttura anziché della variabile.

  • Accesso mediante un'espressione di istanza. Se si accede a un elemento condiviso mediante un'espressione che restituisce un'istanza della relativa classe o struttura, il compilatore effettua l'accesso mediante il nome della classe o della struttura, anziché valutare l'espressione. In questo modo si ottengono risultati imprevisti se l'espressione, oltre a restituire l'istanza, doveva eseguire altre operazioni. Nell'esempio riportato di seguito viene illustrata questa situazione.

    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
    

    Nell'esempio precedente il compilatore genera un messaggio di avviso tutte e due le volte in cui il codice accede alla variabile condivisa total mediante un'istanza. In ciascun caso, l'accesso viene effettuato direttamente mediante la classe shareTotal e non viene utilizzata alcuna istanza. Nel caso della chiamata alla routine returnClass, non viene neppure generata una chiamata a returnClass, pertanto l'azione aggiuntiva di visualizzazione di "Function returnClass() called" non viene eseguita.

Il modificatore Shared può essere utilizzato nei seguenti contesti:

Istruzione Dim

Istruzione Event

Istruzione Function

Istruzione Operator

Istruzione Property

Istruzione Sub

Vedere anche

Concetti

Durata in Visual Basic

Routine in Visual Basic

Membri condivisi in Visual Basic

Riferimenti

Shadows

Static (Visual Basic)

Altre risorse

Strutture: tipi di dati dell'utente

Cenni preliminari sulle classi