Share via


Résolution d'une référence lorsque plusieurs variables ont le même nom

Mise à jour : novembre 2007

Lorsque le compilateur tente de faire correspondre une référence de nom à une déclaration de nom, il recherche la déclaration correspondante avec la plus petite portée. Cela signifie qu'il commence par le code qui effectue la référence et qu'il parcourt ensuite les niveaux successifs d'éléments conteneurs.

Si vous souhaitez substituer ce processus de recherche et spécifier un nom déclaré dans une portée plus générale, vous devez qualifier le nom avec l'élément conteneur de la portée plus générale. Dans certains cas, vous devrez peut-être qualifier aussi l'élément conteneur. Pour plus d'informations sur la qualification de noms, consultez Comment : qualifier un nom d'élément déclaré.

Vous devrez peut-être également qualifier une référence de nom si votre application a accès à plusieurs éléments de programmation avec le même nom. Pour obtenir des exemples, consultez « Classes avec le même nom » dans cette page d'aide et Comment : faire la distinction entre deux éléments portant le même nom.

La plus petite portée

L'exemple suivant montre des références à deux variables avec le même nom.

' 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

L'exemple précédent déclare deux variables, chacune nommée totalCount, à différents niveaux de portée dans le module container. Lorsque la procédure showCount affiche totalCount sans qualification, le compilateur Visual Basic résout la référence à la déclaration avec la plus petite portée, à savoir la déclaration locale à l'intérieur de showCount. Lorsqu'il qualifie totalCount avec le module conteneur container, le compilateur résout la référence à la déclaration avec la portée plus générale.

Membres d'autres éléments conteneurs

Lorsque vous utilisez un membre non partagé d'une autre classe ou structure, vous devez d'abord qualifier le nom du membre avec une variable ou une expression qui pointe vers une instance de la classe ou structure. Dans l'exemple suivant, demoClass est une instance d'une classe nommée class1.

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

Vous ne pouvez pas utiliser le nom de la classe pour qualifier un membre qui n'est pas Shared (Visual Basic). Vous devez d'abord créer une instance dans une variable objet (dans ce cas-ci demoClass), puis la référencer par le nom de la variable.

Si une classe ou une structure a un membre Shared, vous pouvez qualifier ce membre avec le nom de structure ou de classe ou avec une variable ou expression qui pointe vers une instance.

Un module n'a pas d'instances séparées et tous ses membres sont Shared par défaut. Par conséquent, vous qualifiez un membre de module avec le nom du module.

Exemple de référence qualifiée

L'exemple suivant montre des références qualifiées à des procédures de membre de module.

' 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

L'exemple précédent déclare deux procédures Sub, toutes deux nommées perform, dans des modules différents d'un projet. Chacune d'elles peut être spécifiée sans qualification dans son propre module, mais doit être qualifiée si elle est référencée ailleurs. La dernière référence dans module3 ne qualifiant pas perform, le compilateur ne peut pas résoudre cette référence.

Références aux projets

Pour utiliser des éléments Public (Visual Basic) définis dans un autre projet, vous devez avant tout définir une référence à l'assembly ou la bibliothèque de types de ce projet. Pour définir une référence, cliquez sur Ajouter une référence dans le menu Projet ou utilisez l'option de compilateur de ligne de commande /reference (Visual Basic).

Vous pouvez, par exemple, utiliser le modèle objet XML du .NET Framework. Si vous définissez une référence à l'espace de noms System.Xml, vous pouvez déclarer et utiliser n'importe laquelle de ses classes, telles que XmlDocument. L'exemple suivant utilise 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

Importation d'éléments conteneurs

Il est possible d'utiliser l'instruction Imports (voir Imports, instruction (espace de noms et type .NET)) pour importer les espaces de noms contenant les modules ou classes que vous souhaitez utiliser. Cela vous permet de faire référence aux éléments définis dans un espace de noms importé sans qualifier complètement leurs noms. L'exemple suivant réécrit l'exemple précédent pour importer l'espace de noms 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

En outre, l'instruction Imports peut définir un alias d'importation pour chaque espace de noms importé. Ainsi, votre code source est plus court et plus facile à lire. L'exemple suivant réécrit l'exemple précédent pour utiliser xD en tant qu'alias pour l'espace de noms 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'instruction Imports ne rend pas d'éléments d'autres projets disponibles à votre application. C'est-à-dire qu'elle ne prend pas la place de la définition d'une référence. L'importation d'un espace de noms rend simplement inutile la qualification des noms définis dans cet espace de noms.

Vous pouvez aussi utiliser l'instruction Imports pour importer des modules, des classes, des structures et des énumérations. Vous pouvez ensuite utiliser les membres de ces éléments importés sans qualification. Toutefois, vous devez toujours qualifier les membres non partagés de classes et de structures avec une variable ou expression qui correspond à une instance de la classe ou de la structure.

Classes portant le même nom

Lorsque vous créez une nouvelle instance d'un objet, vous devrez peut-être qualifier la classe avec l'espace de noms ou la bibliothèque de types à laquelle elle appartient. Par exemple, les espaces de noms System.Windows.Forms et System.Web.UI.WebControls contiennent tous deux une classe Label (System.Windows.Forms.Label et System.Web.UI.WebControls.Label). Si votre application utilise les deux ou si elle définit sa propre classe Label, vous devez faire la distinction entre les différents objets Label. Incluez l'alias d'espace de noms ou d'importation dans la déclaration de variable. L'exemple suivant utilise l'alias d'importation.

' 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()

Indications concernant l'attribution d'un nom

Lorsque vous définissez deux ou plusieurs éléments de programmation avec le même nom, il peut en résulter une ambiguïté de noms lorsque le compilateur tente de résoudre une référence à ce nom. Si plusieurs définitions sont dans la portée ou si aucune définition n'est dans la portée, la référence ne peut pas être résolue. Pour obtenir un exemple, consultez « Exemple de référence qualifiée » dans cette page d'aide.

Pour éviter toute ambiguïté, vous pouvez attribuer des noms uniques à tous vos éléments. Ensuite, vous pouvez faire référence à tout élément sans devoir qualifier son nom avec un espace de noms, un module ou une classe. Vous réduisez également les risques de faire référence par erreur à l'élément incorrect.

Voir aussi

Tâches

Comment : modifier des propriétés de projet et des paramètres de configuration

Comment : qualifier un nom d'élément déclaré

Comment : faire la distinction entre deux éléments portant le même nom

Concepts

Variables en Visual Basic

Référence

Imports, instruction (espace de noms et type .NET)

New (Visual Basic)

Public (Visual Basic)

Autres ressources

Références aux éléments déclarés