Procedura: nascondere una variabile con lo stesso nome di un'altra variabile
Aggiornamento: novembre 2007
Per nascondere una variabile è possibile eseguirne lo shadowing, ossia ridefinirla con una variabile con lo stesso nome. Sono disponibili due modi per eseguire lo shadowing di una variabile che si desidera nascondere:
Shadowing mediante l'ambito. È possibile dichiarare nuovamente la variabile all'interno di una sottoarea dell'area contenente la variabile da nascondere.
Shadowing mediante ereditarietà. Se la variabile da nascondere è definita a livello di classe, è possibile dichiararla nuovamente con la parola chiave Shadows in una classe derivata.
Due modi per nascondere una variabile
Per nascondere una variabile eseguendone lo shadowing mediante l'ambito
Identificare l'area in cui è definita la variabile da nascondere, quindi determinare una sottoarea in cui ridefinirla con l'altra variabile.
Area della variabile
Sottoarea consentita per la ridefinizione della variabile
Modulo
Classe all'interno del modulo
Classe
Sottoclasse all'interno della classe
Routine all'interno della classe
Non è possibile ridefinire una variabile di routine in un blocco all'interno di tale routine, ad esempio in una costruzione If...End If o in un ciclo For.
Creare la sottoarea, se non esiste già.
All'interno della sottoarea scrivere un'Istruzione Dim (Visual Basic) che dichiari la variabile di shadowing.
Quando il codice all'interno della sottoarea fa riferimento al nome della variabile, il compilatore risolve il riferimento nella variabile di shadowing.
Nell'esempio riportato di seguito viene illustrato lo shadowing mediante l'ambito e viene creato un riferimento che ignora lo shadowing.
Module shadowByScope ' The following statement declares num as a module-level variable. Public num As Integer Sub show() ' The following statement declares num as a local variable. Dim num As Integer ' The following statement sets the value of the local variable. num = 2 ' The following statement displays the module-level variable. MsgBox(CStr(shadowByScope.num)) End Sub Sub useModuleLevelNum() ' The following statement sets the value of the module-level variable. num = 1 show() End Sub End Module
Nell'esempio precedente viene dichiarata la variabile num a livello di modulo e a livello di routine (nella routine show). La variabile locale num nasconde la variabile num a livello di modulo all'interno di show. La variabile locale viene quindi impostata su 2. Tuttavia, non esiste alcuna variabile locale per nascondere num nella routine useModuleLevelNum. Di conseguenza, la routine useModuleLevelNum imposta su 1 il valore della variabile a livello di modulo.
La chiamata a MsgBox all'interno di show ignora il meccanismo di shadowing specificando num con il nome del modulo. Di conseguenza, verrà visualizzata la variabile a livello di modulo anziché la variabile locale.
Per nascondere una variabile eseguendone lo shadowing mediante ereditarietà
Assicurarsi che la variabile da nascondere sia dichiarata in una classe e a livello di classe (all'esterno di una qualsiasi routine). In caso contrario, non sarà possibile eseguire lo shadowing mediante ereditarietà.
Definire una classe derivata dalla classe della variabile, se non ne esiste già una.
All'interno della classe derivata scrivere un'istruzione Dim che dichiari la variabile, includendo la parola chiave Shadows nella dichiarazione.
Quando il codice nella classe derivata fa riferimento al nome della variabile, il compilatore risolve il riferimento nella variabile.
Nell'esempio riportato di seguito viene illustrato lo shadowing mediante ereditarietà. Vengono creati due riferimenti, uno che accede alla variabile di shadowing e l'altro che ignora lo shadowing.
Public Class shadowBaseClass Public shadowString As String = "This is the base class string." End Class Public Class shadowDerivedClass Inherits shadowBaseClass Public Shadows shadowString As String = "This is the derived class string." Public Sub showStrings() Dim s As String = "Unqualified shadowString: " & shadowString _ & vbCrLf & "MyBase.shadowString: " & MyBase.shadowString MsgBox(s) End Sub End Class
Nell'esempio precedente la variabile shadowString viene dichiarata nella classe base e viene quindi nascosta nella classe derivata. La routine showStrings della classe derivata visualizza la versione di shadowing della stringa quando il nome shadowString non è qualificato, quindi visualizza la versione nascosta quando shadowString viene qualificato con la parola chiave MyBase.
Programmazione efficiente
Il meccanismo di shadowing introduce più versioni di una variabile con lo stesso nome. Quando un'istruzione di codice fa riferimento al nome della variabile, la versione in cui il compilatore risolve il riferimento dipende da fattori quali la posizione dell'istruzione di codice e la presenza di una stringa di qualificazione. Questa caratteristica può aumentare il rischio di fare riferimento a una versione non desiderata di una variabile nascosta. È possibile ridurre tale rischio specificando in modo completo tutti i riferimenti a una variabile nascosta.
Vedere anche
Attività
Procedura: distinguere tra due elementi con lo stesso nome
Procedura: nascondere una variabile ereditata
Procedura: accedere a una variabile nascosta da una classe derivata
Concetti
Risoluzione di un riferimento quando più variabili hanno lo stesso nome
Differenze tra shadowing e override