Risoluzione di un riferimento quando più variabili hanno lo stesso nome
Aggiornamento: novembre 2007
Quando tenta di creare una corrispondenza tra il riferimento a un nome e una dichiarazione di nome, il compilatore cerca la dichiarazione corrispondente 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.
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. Per ulteriori informazioni sulla qualifica dei nomi, vedere Procedura: qualificare il nome di un elemento dichiarato.
Potrebbe inoltre essere necessario qualificare un riferimento a un nome se l'applicazione accede a più elementi di programmazione con lo stesso nome. Per alcuni esempi, vedere Procedura: distinguere tra due elementi con lo stesso nome e la sezione "Classi con lo stesso nome" in questo pagina.
Ambito più ristretto
Nell'esempio riportato di seguito sono indicati alcuni riferimenti a due variabili con lo stesso nome.
' 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
Nell'esempio precedente 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.
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.
Esempio di riferimento qualificato
Nell'esempio riportato di seguito sono indicati alcuni riferimenti qualificati a routine dei membri del modulo.
' 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
Nell'esempio precedente 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.
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.
Classi con lo stesso nome
Quando si crea una nuova istanza di un oggetto, è possibile che si debba qualificare la classe con lo spazio dei nomi o la libreria dei tipi di appartenenza. 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()
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.
Vedere anche
Attività
Procedura: modificare le proprietà e le impostazioni di configurazione dei progetti
Procedura: qualificare il nome di un elemento dichiarato
Procedura: distinguere tra due elementi con lo stesso nome
Concetti
Riferimenti
Istruzione Imports (tipo e spazio dei nomi .NET)