Condividi tramite


Riferimenti agli elementi dichiarati (Visual Basic)

Quando il tuo codice si riferisce a un elemento dichiarato, il compilatore di Visual Basic confronta il nome nel tuo riferimento con la dichiarazione appropriata di quel 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 mettere in corrispondenza un riferimento al nome con una dichiarazione di nome con l'ambito più ristretto. Ciò significa che inizia con il codice che fa riferimento e si espande verso l'esterno attraverso 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 procedura showCount visualizza totalCount senza specifica, 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 precederlo nell'istruzione di origine con 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 potrebbe a sua volta trovarsi in un altro elemento contenitore, solitamente un namespace. Potrebbe essere necessario includere diversi elementi contenitori 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.

    outerSpace innerSpace → → → holdsTotalstotals

  3. Preparare la stringa di qualificazione per l'elemento di destinazione. Inserire un punto (.) dopo ogni elemento nel percorso. L'applicazione deve avere accesso a ogni elemento nella 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. Precedere il nome dell'elemento di destinazione con la stringa di qualificazione. Il nome deve seguire immediatamente il punto (.) che viene dopo il modulo, la classe o la struttura che contengono 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 può corrispondere il riferimento all'elemento di destinazione.

Potrebbe anche essere necessario qualificare un riferimento al nome 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 Label classe (System.Windows.Forms.Label e System.Web.UI.WebControls.Label). Se l'applicazione usa entrambi o se definisce la propria Label classe, è necessario distinguere i diversi Label oggetti. 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 contenitori

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 punta 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 della classe per qualificare un membro che non è Condiviso. È prima necessario creare un'istanza in una variabile oggetto (in questo caso demoClass) e quindi farvi riferimento in base al nome della variabile.

Se una classe o una struttura ha un Shared membro, puoi qualificare tale membro con la classe o il nome della struttura, oppure 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 membro del modulo. Nell'esempio vengono dichiarate due Sub procedure, entrambe denominate perform, in moduli diversi in un progetto. Ognuno di essi può essere specificato senza qualificarsi all'interno del proprio modulo, ma deve essere qualificato se viene fatto riferimento da qualsiasi altra posizione. Poiché il riferimento finale in module3 non qualifica perform, il compilatore non è in grado di 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, scegliere Aggiungi riferimento dal 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 System.Xml spazio dei nomi , è possibile dichiarare e usare una delle relative classi, ad esempio XmlDocument. Nell'esempio seguente viene usato 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 contenenti

È possibile utilizzare l'istruzione Imports (.NET Spazio dei nomi e Tipo) per importare gli spazi dei nomi che contengono i moduli o le classi che si desidera utilizzare. In questo modo è possibile fare riferimento agli elementi definiti in uno spazio dei nomi importato senza qualificarne completamente i nomi. Nell'esempio seguente si riscrive quello 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, l'esempio precedente viene riscritto per usare 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 alla tua applicazione elementi di altri progetti. Cioè, non sostituisce l'impostazione di un riferimento. L'importazione di uno spazio dei nomi rimuove semplicemente il requisito 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 qualifica. 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.

Linee guida per la denominazione

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

È possibile evitare 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.

Ombreggiamento

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

Vedere anche