Riferimenti a elementi dichiarati (Visual Basic)

Quando il codice fa riferimento a un elemento dichiarato, il compilatore Visual Basic fa corrispondere il nome del riferimento alla dichiarazione appropriata di tale nome. Se più di un elemento viene dichiarato con lo stesso nome, è possibile controllare a quale di questi elementi fare riferimento qualificandone il nome.

Il compilatore tenta di far corrispondere un riferimento a un nome a una dichiarazione di nome con l'ambito più ristretto. Ciò significa che inizia con il codice che crea il riferimento e procede attraverso i livelli successivi di elementi contenitori.

Nell'esempio seguente vengono illustrati i riferimenti a due variabili con lo stesso nome. Nell'esempio vengono dichiarate due variabili, ognuna denominata totalCount, a livelli diversi di ambito 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 qualifica totalCount 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  

Qualificazione di un nome di elemento

Se si vuole eseguire l'override di questo processo di ricerca e specificare un nome dichiarato in un ambito più ampio, è necessario qualificare il nome con l'elemento contenitore dell'ambito più ampio. In alcuni casi, potrebbe anche essere necessario qualificare l'elemento contenitore.

Qualificare un nome significa farlo precedere nell'istruzione di origine da informazioni che identificano dove è definito l'elemento di destinazione. Queste informazioni sono denominate stringa di qualificazione. Può includere uno o più spazi dei nomi e un modulo, una classe o una struttura.

La stringa di qualificazione deve specificare in modo univoco il modulo, la classe o la struttura contenente l'elemento di destinazione. Il contenitore può a sua volta trovarsi in un altro elemento contenitore, in genere uno spazio dei nomi. Potrebbe essere necessario includere diversi elementi contenitore nella stringa di qualificazione.

Per accedere a un elemento dichiarato qualificandone il nome

  1. Determinare la posizione in cui è stato definito l'elemento. Può includere uno spazio dei nomi o anche una gerarchia di spazi dei nomi. All'interno dello spazio dei nomi di livello più basso, l'elemento deve essere contenuto in un modulo, una classe o una struttura.

    ' Assume the following hierarchy exists outside your code.  
    Namespace outerSpace  
        Namespace innerSpace  
            Module holdsTotals  
                Public Structure totals  
                    Public thisTotal As Integer  
                    Public Shared grandTotal As Long  
                End Structure  
            End Module  
        End Namespace  
    End Namespace  
    
  2. Determinare un percorso di qualificazione in base alla posizione dell'elemento di destinazione. Iniziare con lo spazio dei nomi di livello più alto, passare allo spazio dei nomi di livello più basso e terminare con il modulo, la classe o la struttura contenente l'elemento di destinazione. Ogni elemento nel percorso deve contenere l'elemento che lo segue.

    outerSpaceinnerSpaceholdsTotalstotals

  3. Preparare la stringa di qualificazione per l'elemento di destinazione. Inserire un punto (.) dopo ogni elemento del percorso. L'applicazione deve avere accesso a ogni elemento della stringa di qualificazione.

    outerSpace.innerSpace.holdsTotals.totals.  
    
  4. Scrivere l'espressione o l'istruzione di assegnazione che fa riferimento all'elemento di destinazione nel modo normale.

    grandTotal = 9000  
    
  5. Far precedere il nome dell'elemento di destinazione dalla stringa di qualificazione. Il nome deve seguire immediatamente il punto (.) che segue il modulo, la classe o la struttura che contiene l'elemento.

    ' Assume the following module is part of your code.  
    Module accessGrandTotal  
        Public Sub setGrandTotal()  
            outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000  
        End Sub  
    End Module  
    
  6. Il compilatore usa la stringa di qualificazione per trovare una dichiarazione chiara e non ambigua a cui far corrispondere il riferimento all'elemento di destinazione.

Potrebbe essere necessario qualificare un riferimento al nome anche se l'applicazione ha accesso a più elementi di programmazione con lo stesso nome. Ad esempio, gli spazi dei nomi System.Windows.Forms e System.Web.UI.WebControls contengono entrambi una classe Label (System.Windows.Forms.Label e System.Web.UI.WebControls.Label). Se l'applicazione li usa entrambi o se definisce una propria classe Label, è necessario distinguere i diversi oggetti Label. Includere lo spazio dei nomi o l'alias di importazione nella dichiarazione della variabile. Nell'esempio seguente viene usato 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 usa un membro non condiviso di un'altra classe o struttura, è prima necessario qualificare il nome del membro con una variabile o un'espressione che punti a un'istanza della classe o della struttura. Nell'esempio seguente demoClass è un'istanza di una classe denominata class1.

Dim demoClass As class1 = New class1()  
demoClass.someSub[(argumentlist)]  

Non è possibile usare il nome stesso della classe per qualificare un membro non condiviso. È necessario creare prima un'istanza in una variabile oggetto (in questo caso demoClass) e quindi farvi riferimento con il nome della variabile.

Se una classe o una struttura ha un membro Shared, è possibile qualificare tale membro con il nome della classe o della struttura o con una variabile o un'espressione che punta a un'istanza.

Un modulo non dispone di istanze separate e tutti i relativi membri sono Shared per impostazione predefinita. Pertanto, si qualifica un membro del modulo con il nome del modulo.

Nell'esempio seguente vengono illustrati riferimenti qualificati alle routine dei membri del modulo. Nell'esempio vengono dichiarate due routine Sub, entrambe denominate perform, in moduli diversi di un progetto. Ognuna di esse può essere specificata senza qualificazione all'interno del proprio modulo, ma deve essere qualificata se vi viene fatto riferimento da qualsiasi altro modulo. Poiché il riferimento finale in module3 non qualifica perform, il compilatore non può risolvere tale riferimento.

' 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 ai progetti

Per usare elementi pubblici definiti in un altro progetto, è necessario innanzitutto impostare un riferimento all'assembly o alla libreria dei tipi del progetto. Per impostare un riferimento, fare clic su Aggiungi riferimento nel menu Progetto oppure usare l'opzione del compilatore della riga di comando -reference (Visual Basic).

Ad esempio, è possibile usare il modello a oggetti XML di .NET Framework. Se si imposta un riferimento allo spazio dei nomi System.Xml, è possibile dichiarare e usare una delle relative classi, ad esempio XmlDocument. Nell'esempio seguente viene utilizzato 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 contenitori

È possibile usare l'istruzione Imports (spazio dei nomi e tipo .NET) per importare gli spazi dei nomi che contengono i moduli o le classi da usare. In questo modo è possibile fare riferimento agli elementi definiti in uno spazio dei nomi importato senza qualificarne completamente i nomi. Nell'esempio seguente viene riscritto l'esempio precedente per 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  

Inoltre, l'istruzione Imports può definire un alias di importazione per ogni spazio dei nomi importato. Questo può rendere il codice sorgente più breve e più facile da leggere. Nell'esempio seguente viene riscritto l'esempio precedente per usare xD come alias dello 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 all'applicazione elementi di altri progetti. Ovvero, non sostituisce l'impostazione di un riferimento. L'importazione di uno spazio dei nomi elimina semplicemente la necessità di qualificare i nomi definiti in tale spazio dei nomi.

È anche possibile usare l'istruzione Imports per importare moduli, classi, strutture ed enumerazioni. È quindi possibile usare i membri di tali elementi importati senza qualificazione. Tuttavia, è sempre necessario qualificare membri non condivisi di classi e strutture con una variabile o un'espressione che restituisce un'istanza della classe o della struttura.

Convenzioni di denominazione

Quando si definiscono due o più elementi di programmazione con lo stesso nome, può verificarsi un'ambiguità del nome quando il compilatore tenta di risolvere un riferimento a tale nome. Se nell'ambito è presente più di una definizione o se non è presente alcuna definizione, il riferimento è irrisolvibile. Per un esempio, vedere "Esempio di riferimento completo" in questa pagina della Guida.

È possibile evitare l'ambiguità dei nomi assegnando a tutti gli elementi nomi univoci. È quindi possibile fare riferimento a qualsiasi elemento senza doverne qualificare il nome con uno spazio dei nomi, un modulo o una classe. Si riducono anche le probabilità di fare riferimento accidentalmente all'elemento sbagliato.

Shadowing

Quando due elementi di programmazione condividono lo stesso nome, uno di essi può nascondere l'altro, o eseguirne lo shadowing. Un elemento nascosto non è disponibile come riferimento. Quando invece il codice usa il nome dell'elemento nascosto, il compilatore Visual Basic lo risolve nell'elemento di shadowing. Per una spiegazione più dettagliata con esempi, vedere Shadowing in Visual Basic.

Vedi anche