Riferimenti a elementi dichiarati (Visual Basic)
Quando il codice fa riferimento a un elemento dichiarato, il compilatore di Visual Basic fa corrispondere il nome nel riferimento alla dichiarazione corretta di tale nome. Se più elementi vengono dichiarati con lo stesso nome, è possibile decidere a quale di questi elementi fare riferimento tramite la qualifica del nome.
Il compilatore tenta di creare una corrispondenza tra il riferimento a un nome e una dichiarazione di nome, con l'ambito più ristretto, partendo dal codice che ha creato il riferimento e spostandosi verso l'esterno attraverso i successivi livelli degli elementi contenitore.
Nell'esempio riportato di seguito sono indicati alcuni riferimenti a due variabili con lo stesso nome. Nell'esempio vengono dichiarate due variabili, entrambe denominate totalCount, a livelli di ambito differenti nel modulo container. Quando la routine showCount visualizza totalCount senza qualificazione, il compilatore Visual Basic risolve il riferimento alla dichiarazione con l'ambito più ristretto, ovvero la dichiarazione locale all'interno di showCount. Quando totalCount è qualificato con il modulo contenitore container, il compilatore risolve il riferimento alla dichiarazione con l'ambito più ampio.
' Assume these two modules are both in the same assembly.
Module container
Public totalCount As Integer = 1
Public Sub showCount()
Dim totalCount As Integer = 6000
' The following statement displays the local totalCount (6000).
MsgBox("Unqualified totalCount is " & CStr(totalCount))
' The following statement displays the module's totalCount (1).
MsgBox("container.totalCount is " & CStr(container.totalCount))
End Sub
End Module
Module callingModule
Public Sub displayCount()
container.showCount()
' The following statement displays the containing module's totalCount (1).
MsgBox("container.totalCount is " & CStr(container.totalCount))
End Sub
End Module
Qualificare un nome di un elemento
Se si desidera eseguire l'override del processo di ricerca e specificare un nome dichiarato in un ambito più ampio, è necessario qualificare il nome con l'elemento contenitore di tale ambito. In alcuni casi può essere necessario qualificare anche l'elemento contenitore.
Qualificare un nome significa farlo precedere, nell'istruzione del codice sorgente, da informazioni che identificano la posizione in cui è definito l'elemento di destinazione. Tali informazioni costituiscono la stringa di qualificazione e possono includere uno o più spazi dei nomi oltre a un modulo, una classe o una struttura.
Nella stringa di qualificazione deve essere specificato in modo non ambiguo il modulo, la classe o la struttura contenente l'elemento di destinazione. Il contenitore può essere posizionato in un altro contenitore, in genere uno spazio dei nomi. Può essere necessario includere nella stringa di qualificazione numerosi contenitori.
Per accedere a un elemento dichiarato mediante la qualificazione del relativo nome |
|
Potrebbe inoltre essere necessario qualificare un riferimento a un nome se l'applicazione accede a più elementi di programmazione con lo stesso nome. Gli spazi dei nomi System.Windows.Forms e System.Web.UI.WebControls, ad esempio, contengono entrambi una classe Label (System.Windows.Forms.Label e System.Web.UI.WebControls.Label). Se l'applicazione li utilizza entrambi, o definisce una propria classe Label, è necessario distinguere i diversi oggetti Label. Includere lo spazio dei nomi o l'alias di importazione nella dichiarazione di variabile. Nell'esempio riportato di seguito viene utilizzato l'alias di importazione.
' The following statement must precede all your declarations.
Imports win = System.Windows.Forms, web = System.Web.UI.WebControls
' The following statement references the Windows.Forms.Label class.
Dim winLabel As New win.Label()
Membri di altri elementi contenitore
Quando si utilizza un membro non condiviso di un'altra classe o struttura, è necessario qualificare prima il nome del membro con una variabile o espressione che punti a un'istanza della classe o struttura. Nell'esempio riportato di seguito demoClass è un'istanza di una classe denominata class1.
Dim demoClass As class1 = New class1()
demoClass.someSub[(argumentlist)]
Non è possibile utilizzare direttamente il nome della classe per qualificare un membro che non sia Shared (Visual Basic). È innanzitutto necessario creare un'istanza in una variabile oggetto, in questo caso demoClass, e quindi fare riferimento a tale istanza in base al nome della variabile.
Se una classe o una struttura contiene un membro Shared, è possibile qualificare tale membro con il nome della classe o della struttura oppure con una variabile o un'espressione che faccia riferimento a un'istanza.
Un modulo non dispone di alcuna istanza separata e tutti i relativi membri sono Shared per impostazione predefinita. Un membro del modulo, quindi, deve essere qualificato con il nome del modulo.
Nell'esempio riportato di seguito sono indicati alcuni riferimenti qualificati a routine dei membri del modulo. Nell'esempio vengono dichiarate due routine Sub, entrambe denominate perform, in moduli diversi di un progetto. Ciascuna routine può essere specificata senza qualifica all'interno del relativo modulo, ma è necessario che sia qualificata se il riferimento all'elemento è presente in un altro punto. Poiché il riferimento finale in module3 non qualifica perform, il compilatore non è in grado di risolverlo.
' Assume these three modules are all in the same assembly.
Module module1
Public Sub perform()
MsgBox("module1.perform() now returning")
End Sub
End Module
Module module2
Public Sub perform()
MsgBox("module2.perform() now returning")
End Sub
Public Sub doSomething()
' The following statement calls perform in module2, the active module.
perform()
' The following statement calls perform in module1.
module1.perform()
End Sub
End Module
Module module3
Public Sub callPerform()
' The following statement calls perform in module1.
module1.perform()
' The following statement makes an unresolvable name reference
' and therefore generates a COMPILER ERROR.
perform() ' INVALID statement
End Sub
End Module
Riferimenti a progetti
Per utilizzare elementi Public (Visual Basic) definiti in un altro progetto, è necessario impostare prima un riferimento all'assembly o alla libreria dei tipi di quel progetto. Per impostare un riferimento, fare clic su Aggiungi riferimento nel menu Progetto o utilizzare l'opzione del compilatore da riga di comando /reference (Visual Basic).
È possibile, ad esempio, utilizzare il modello a oggetti XML di .NET Framework. Se si imposta un riferimento allo spazio dei nomi System.Xml, è possibile dichiarare e utilizzare una qualsiasi delle relative classi, ad esempio XmlDocument. Nell'esempio seguente viene utilizzata l'interfaccia XmlDocument.
' Assume this project has a reference to System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As System.Xml.XmlDocument
Importazione di elementi contenitore
È possibile utilizzare l'Istruzione Imports (tipo e spazio dei nomi .NET) per importare gli spazi dei nomi contenenti i moduli o le classi da utilizzare. Questo consente di fare riferimento agli elementi definiti in uno spazio dei nomi importato senza qualificarne completamente i nomi. Nell'esempio riportato di seguito viene riscritto l'esempio precedente in modo da importare lo spazio dei nomi System.Xml.
' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As XmlDocument
L'istruzione Imports consente inoltre di definire un alias di importazione per ogni spazio dei nomi importato. Questo contribuisce a rendere il codice sorgente più breve e più semplice da leggere. Nell'esempio riportato di seguito viene riscritto l'esempio precedente in modo da utilizzare xD come alias per lo spazio dei nomi System.Xml.
' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports xD = System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As xD.XmlDocument
L'istruzione Imports non rende disponibili nell'applicazione elementi di altri progetti. In altre parole, non è un'istruzione alternativa all'impostazione di un riferimento. L'importazione di uno spazio dei nomi elimina semplicemente la necessità di qualificare i nomi definiti nello spazio dei nomi.
È inoltre possibile utilizzare l'istruzione Imports per importare moduli, classi, strutture ed enumerazioni. È quindi possibile utilizzare i membri degli elementi importati senza qualifica. È tuttavia necessario qualificare sempre i membri non condivisi di classi e strutture con una variabile o un'espressione che restituisca un'istanza della classe o della struttura.
Convenzioni di denominazione
Se si definiscono due o più elementi di programmazione con lo stesso nome, è possibile che si verifichi un'ambiguità dei nomi quando il compilatore tenta di risolvere un riferimento a quel nome. Se nell'ambito è inclusa più di una definizione, o nessuna, il riferimento non può essere risolto. Per un esempio, vedere "Esempio di riferimento qualificato" in questa pagina.
È possibile evitare tale ambiguità fornendo a tutti gli elementi nomi univoci. In questo modo è possibile fare riferimento a un qualsiasi elemento senza doverne qualificare il nome con uno spazio dei nomi, un modulo o una classe. Questo consente, inoltre, di ridurre le probabilità che venga fatto riferimento accidentalmente all'elemento errato.
Shadowing
Quando a due elementi di programmazione è assegnato lo stesso nome, è possibile che uno dei due nasconda l'altro, o che ne esegua lo shadowing. Non è possibile fare riferimento a un elemento nascosto. Quando invece nel codice viene utilizzato il nome dell'elemento nascosto, il compilatore Visual Basic risolve tale nome nell'elemento di shadowing. Per un'analisi più dettagliata di questo esempio, vedere Shadowing in Visual Basic.
Vedere anche
Attività
Procedura: modificare le proprietà e le impostazioni di configurazione dei progetti
Riferimenti
Istruzione Imports (tipo e spazio dei nomi .NET)
Concetti
Nomi di elementi dichiarati (Visual Basic)