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 evitan las ambigüedades y simplifican las referencias cuando se usan grupos de objetos grandes, como las bibliotecas de clases.
Por ejemplo, .NET Framework define la clase ListBox en el espacio de nombres System.Windows.Forms. En el siguiente fragmento de código 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 llama contaminación de espacios de nombres, en el que el desarrollador de una biblioteca de clases está obstaculizado por el uso de nombres similares en otra biblioteca. Estos conflictos con componentes existentes a veces se denominan conflictos de nombres.
Por ejemplo, si crea una clase denominada ListBox
, puede usarla en su proyecto sin ninguna calificación, pero si quiere usar la clase ListBox de .NET Framework en el mismo proyecto, debe usar una referencia completa para que 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 siguiente ilustración se muestran dos jerarquías de espacio de nombres que contienen un objeto denominado ListBox
.
Todos los archivos ejecutables que se creen con Visual Basic contienen de forma predeterminada un espacio de nombres con el mismo nombre que el proyecto. Por ejemplo, si define un objeto en un proyecto denominado ListBoxProject
, el archivo ejecutable ListBoxProject.exe contiene un espacio de nombres llamado 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 ( SomeNameSpace
) en un ensamblado ( Assemb1
) y definir clases adicionales para el mismo espacio de nombres desde un ensamblado denominado Assemb2
.
nombres completos
Los nombres completos son referencias de objetos que llevan como prefijo el nombre del espacio de nombres en el que se define el objeto. Puede usar los objetos definidos en otros proyectos si crea una referencia a la clase (eligiendo Agregar referencia desde el menú Proyecto ) y usa el nombre completo del objeto en el código. En el siguiente fragmento de código se 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 evitan conflictos de nomenclatura, ya que permiten que el compilador determine el objeto que se está usando, aunque los nombres pueden llegar a ser largos y complicados. Para solucionar este problema, puede usar la instrucción Imports
para definir un alias: un nombre abreviado que puede usar en lugar de un nombre completo. Por ejemplo, en el siguiente ejemplo de código se crean alias para dos nombres completos y se usan 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 instrucción Imports
sin un alias, puede usar todos los nombres de ese espacio de nombres sin ninguna calificación, siempre que sean únicos en 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 calificarla por completo, Visual Basic generará 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 tales como módulos, interfaces, clases, delegados, enumeraciones, estructuras y otros espacios de nombres. Los elementos tales como propiedades, procedimientos, variables y eventos no se pueden definir en el nivel de espacio de nombres. Estos elementos deben declararse dentro de contenedores tales 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 siguiente ejemplo 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 palabra clave Global
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 obtener acceso a otros espacios de nombres de nivel de raíz, como Microsoft.VisualBasic, y a cualquier espacio de nombres asociado a su proyecto.
Palabra clave Global en las instrucciones de espacio de nombres
También puede usar la palabra clave Global
en una Namespace Statement. con lo que podrá 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 de este. Visual Studio asigna el nombre del proyecto como el espacio de nombres raíz predeterminado para todo el código del proyecto. Por ejemplo, si el proyecto se llama ConsoleApplication1
, los respectivos elementos de programación pertenecerán al espacio de nombres ConsoleApplication1
. Si declara Namespace Magnetosphere
, las referencias a Magnetosphere
en el proyecto tendrán acceso a ConsoleApplication1.Magnetosphere
.
En los siguientes ejemplos se usa la palabra clave Global
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 Application Page, Project Designer (Visual Basic) para ver y modificar el espacio de nombres raíz del proyecto. En cuanto a los proyectos nuevos, el espacio de nombres raíz tiene como nombre predeterminado el nombre del proyecto. Para que Global
sea 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 instrucción Namespace
declara un nombre que también es un espacio de nombres en .NET Framework, el espacio de nombres de .NET Framework dejará de estar disponible si la palabra clave Global
no se usa en un nombre completo. Para habilitar el acceso al espacio de nombres de .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 estuviera presente en la declaración de espacio de nombres, no se podría obtener acceso a StringBuilder sin especificar Global.System.Text.StringBuilder
. Para el proyecto ConsoleApplication1
, las referencias a System.Text
tendrían acceso a ConsoleApplication1.System.Text
si no se usara la palabra clave Global
.
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