Condividi tramite


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

  1. Determinare la posizione in cui l'elemento è stato definito. Tale posizione può includere uno spazio dei nomi o anche una gerarchia di spazi dei nomi. All'interno dello spazio dei nomi di livello inferiore 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 al percorso dell'elemento di destinazione. Iniziare con lo spazio dei nomi di livello superiore, procedere fino a quello di livello inferiore, quindi concludere con il modulo, la classe o la struttura contenente l'elemento di destinazione. Ciascun elemento del percorso deve contenere l'elemento immediatamente successivo.

    outerSpace → innerSpace → holdsTotals → totals

  3. Preparare la stringa di qualificazione per l'elemento di destinazione. Inserire un punto (.) dopo ciascun elemento presente nel percorso. L'applicazione deve essere in grado di accedere a ogni elemento della stringa di qualificazione.

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

    grandTotal = 9000
  5. Prima del nome dell'elemento di destinazione inserire la stringa di qualificazione. Il nome deve seguire immediatamente il punto (.) posto dopo il modulo, la classe o la struttura contenente 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 utilizza la stringa di qualificazione per individuare una dichiarazione chiara e non ambigua da associare al riferimento all'elemento di destinazione.

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)

Operatore New (Visual Basic)

Public (Visual Basic)

Concetti

Nomi di elementi dichiarati (Visual Basic)

Caratteristiche di elementi dichiarati (Visual Basic)

Variabili in Visual Basic