Compartir a través de


Espacios de nombres en Visual Basic

Los espacios de nombres organizan los objetos definidos en un ensamblado. Los ensamblados pueden contener varios espacios de nombres, que a su vez pueden contener otros espacios de nombres. Los espacios de nombres impiden la ambigüedad y simplifican las referencias al usar grandes grupos de objetos como bibliotecas de clases.

Por ejemplo, .NET Framework define la clase ListBox en el espacio de nombres System.Windows.Forms. En el fragmento de código siguiente se muestra cómo declarar una variable con el nombre completo de esta clase:

Dim LBox As System.Windows.Forms.ListBox

Evitar conflictos de nombres

Los espacios de nombres de .NET Framework abordan un problema que a veces se denomina contaminación del espacio de nombres, en el que el desarrollador de una biblioteca de clases se ve obstaculizado por el uso de nombres similares en otra biblioteca. Estos conflictos con los componentes existentes a veces se denominan colisiones de nombres.

Por ejemplo, si crea una nueva clase denominada ListBox, puede usarla dentro del proyecto sin cualificación. Sin embargo, si desea usar la clase .NET Framework ListBox en el mismo proyecto, debe usar una referencia completa para que la referencia sea única. Si la referencia no es única, Visual Basic genera un error que indica que el nombre es ambiguo. En el ejemplo de código siguiente se muestra cómo declarar estos objetos:

' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox

En la ilustración siguiente se muestran dos jerarquías de espacios de nombres, ambas que contienen un objeto denominado ListBox:

Captura de pantalla que muestra dos jerarquías de espacios de nombres.

De forma predeterminada, cada archivo ejecutable que cree con Visual Basic contiene un espacio de nombres con el mismo nombre que el proyecto. Por ejemplo, si define un objeto dentro de un proyecto denominado ListBoxProject, el archivo ejecutable ListBoxProject.exe contiene un espacio de nombres denominado ListBoxProject.

Se puede usar el mismo espacio de nombres en varios ensamblados. Visual Basic los trata como un único conjunto de nombres. Por ejemplo, puede definir clases para un espacio de nombres llamado SomeNameSpace en un ensamblado denominado Assemb1y definir clases adicionales para el mismo espacio de nombres desde un ensamblado denominado Assemb2.

Nombres totalmente calificados

Los nombres completos son referencias de objeto que están precedidas por el nombre del espacio de nombres en el que se define el objeto. Puede usar objetos definidos en otros proyectos si crea una referencia a la clase (seleccionando Agregar referencia en el menú Proyecto ) y, a continuación, use el nombre completo para el objeto en el código. El fragmento de código siguiente muestra cómo usar el nombre completo de un objeto desde el espacio de nombres de otro proyecto:

Dim LBC As New ListBoxProject.Form1.ListBox

Los nombres completos impiden conflictos de nomenclatura porque permiten al compilador determinar qué objeto se está usando. Sin embargo, los nombres en sí mismos pueden ser largos y complicados. Para solucionar este problema, puede usar la Imports instrucción para definir alias, un nombre abreviado que puede utilizar en lugar de un nombre totalmente calificado. Por ejemplo, en el ejemplo de código siguiente se crean alias para dos nombres completos y se usan estos alias para definir dos objetos.

Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox

Si usa la Imports instrucción sin alias, puede usar todos los nombres de ese espacio de nombres sin cualificación, siempre que sean únicos para el proyecto. Si el proyecto contiene instrucciones Imports de los espacios de nombres que contienen elementos con el mismo nombre, debe calificar totalmente ese nombre en el momento de usarlo. Supongamos, por ejemplo, que el proyecto contenía las dos instrucciones Imports siguientes:

' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Si intenta usar Class1 sin calificarlo por completo, Visual Basic genera un error que indica que el nombre Class1 es ambiguo.

Instrucciones de nivel de espacio de nombres

Dentro de un espacio de nombres, puede definir elementos como módulos, interfaces, clases, delegados, enumeraciones, estructuras y otros espacios de nombres. No se pueden definir elementos como propiedades, procedimientos, variables y eventos en el nivel de espacio de nombres. Estos elementos deben declararse en contenedores como módulos, estructuras o clases.

Palabra clave Global en los nombres completos

Si ha definido una jerarquía anidada de espacios de nombres, el código insertado en esa jerarquía podría tener bloqueado el acceso al espacio de nombres System de .NET Framework. En el ejemplo siguiente se muestra una jerarquía en la que el espacio de nombres SpecialSpace.System bloquea el acceso a System.

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As System.Int32  
                Dim n As System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Como resultado, el compilador de Visual Basic no puede resolver correctamente la referencia a System.Int32, porque SpecialSpace.System no define Int32. Puede usar la Global palabra clave para iniciar la cadena de calificación en el nivel más externo de la biblioteca de clases de .NET Framework. De este modo, puede especificar el espacio de nombres System o cualquier otro espacio de nombres en la biblioteca de clases. Esto se ilustra en el siguiente ejemplo:

Namespace SpecialSpace  
    Namespace System  
        Class abc  
            Function getValue() As Global.System.Int32  
                Dim n As Global.System.Int32  
                Return n  
            End Function  
        End Class  
    End Namespace  
End Namespace  

Puede usar Global para acceder a otros espacios de nombres de nivel raíz, como Microsoft.VisualBasic, y cualquier espacio de nombres asociado al proyecto.

Palabra clave Global en las instrucciones de espacio de nombres

También puede usar la palabra clave Global en una Namespace Statement. Esto le permite definir un espacio de nombres fuera del espacio de nombres raíz del proyecto.

Todos los espacios de nombres del proyecto se basan en el espacio de nombres raíz del proyecto. Visual Studio asigna el nombre del proyecto como espacio de nombres raíz predeterminado para todo el código del proyecto. Por ejemplo, si el proyecto se denomina ConsoleApplication1, sus elementos de programación pertenecen al espacio de nombres ConsoleApplication1. Si declara Namespace Magnetosphere, las referencias a Magnetosphere en el proyecto tendrán acceso a ConsoleApplication1.Magnetosphere.

En los ejemplos siguientes se usa la Global palabra clave para declarar un espacio de nombres fuera del espacio de nombres raíz del proyecto.

Namespace Global.Magnetosphere

End Namespace


Namespace Global
    Namespace Magnetosphere

    End Namespace
End Namespace

En una declaración de espacio de nombres, no se puede anidar Global en otro espacio de nombres.

Puede usar la Página de Aplicación, el Diseñador de Proyectos (Visual Basic) para ver y modificar el Namespace raíz del proyecto. En el caso de los nuevos proyectos, el espacio de nombres raíz tiene como valor predeterminado el nombre del proyecto. Para que sea Global el espacio de nombres de nivel superior, puede borrar la entrada Espacio de nombres raíz para que el cuadro esté vacío. Si se borra Espacio de nombres raíz , ya no es necesario usar la palabra clave Global en las declaraciones de espacio de nombres.

Si una Namespace instrucción declara un nombre que también es un espacio de nombres en .NET Framework, el espacio de nombres de .NET Framework se torna inaccesible si la Global palabra clave no se usa en un nombre completamente calificado. Para habilitar el acceso a ese espacio de nombres del .NET Framework sin usar la palabra clave Global, puede incluir la palabra clave Global en la instrucción Namespace.

En el siguiente ejemplo aparece la palabra clave Global en la declaración de espacio de nombres System.Text .

Si la palabra clave Global no estaba presente en la declaración del espacio de nombres, StringBuilder no se podría acceder sin especificar Global.System.Text.StringBuilder. En el caso de un proyecto denominado ConsoleApplication1, las referencias a System.Text accederían ConsoleApplication1.System.Text si no se usaba la Global palabra clave .

Module Module1
    Sub Main()
        Dim encoding As New System.Text.TitanEncoding

        ' If the namespace defined below is System.Text
        ' instead of Global.System.Text, then this statement
        ' causes a compile-time error.
        Dim sb As New System.Text.StringBuilder
    End Sub
End Module

Namespace Global.System.Text
    Class TitanEncoding

    End Class
End Namespace

Consulte también