Espacios de nombres (namespaces)

Espacios de nombres (namespaces)

Un espacio de nombres es un contenedor lógico de código, que nos permite organizar de un modo más óptimo, las clases dentro de un proyecto o ensamblado. Para una mayor información a nivel conceptual sobre este elemento de la plataforma .NET, consulte el lector el tema sobre el lenguaje, apartado Organización del proyecto en ficheros y módulos de código; y también el tema sobre .NET Framework, apartado Namespaces.

En el presente apartado, dedicaremos nuestros esfuerzos al trabajo con los espacios de nombres desde su vertiente práctica, es decir, veremos cómo se utilizan los espacios de nombres en un proyecto para agrupar funcionalmente las clases que contiene.

Para ello se acompaña el proyecto de ejemplo NamespacePruebas, al que podemos acceder haciendo clic aquí .

Cada vez que creamos un nuevo proyecto en VB.NET, se crea un espacio de nombres a nivel del ensamblado, con su mismo nombre, y que engloba a todos los tipos o clases que vayamos creando. Este espacio de nombres recibe la denominación de espacio de nombres raíz, y podemos verlo abriendo la ventana de propiedades del proyecto. Ver Figura 197.

Figura 197. Nombre del espacio de nombres raíz en las propiedades del proyecto / ensamblado.

Como muestra la imagen, tanto el ensamblado como su espacio de nombres tienen como nombre ConsoleApplication1, por lo que todas las clases que escribamos dentro de este proyecto estarán dentro de dicho espacio de nombres.

Vamos a ir construyendo progresivamente un ejemplo, para ver las variantes de uso de clases en función del espacio de nombres en el que estén contenidas. Crearemos para ello una nueva aplicación

Programación con Visual Basic .NET © Grupo EIDOS

de consola, y en el fichero de código que incluye por defecto, además del módulo Module1 ya incluido al crearse el proyecto, escribiremos la clase Factura, ver Código fuente 228.

Module Module1 Sub Main() ' como la clase Factura se encuentra ' en el espacio de nombres raíz, ' instanciamos normalmente Dim loFac As New Factura() loFac.piID = 5 loFac.piImporte = 200 loFac.Datos() Console.ReadLine()

End Sub End Module

' clase Factura ' esta clase se encuentra dentro ' del espacio de nombres raíz del ensamblado Public Class Factura

Public piID As Integer Public piImporte As Integer

Public Sub Datos() Console.WriteLine("La factura {0}, tiene un importe de {1}", _ Me.piID, Me.piImporte) End Sub End Class

Código fuente 228

Seguidamente, y en el mismo fichero de código, creamos la clase Empleado, pero la incluimos en el espacio de nombres Personal. Para crear un espacio de nombres en el código de la aplicación debemos utilizar las palabras clave Namespace...End Namespace. Ver Código fuente 229.

' clase Empleado ' esta clase se encuentra dentro ' del espacio de nombres raíz del ensamblado, ' y a su vez, dentro del espacio de ' nombres Personal Namespace Personal

Public Class Empleado Public psID As Integer

Public Sub MostrarDatos()

Console.WriteLine("Identificador del empleado: {0}", Me.psID) Console.ReadLine()

End Sub

End Class End Namespace

Código fuente 229

Debido a que hemos creado una clase dentro de un nuevo espacio de nombres definido en el código, dicho espacio de nombres queda anidado dentro del espacio de nombres raíz del ensamblado. Para instanciar objetos de una clase escrita en un espacio de nombres de esta forma, en primer lugar,

© Grupo EIDOS 18. Métodos y espacios de nombre

debemos importar dicho espacio de nombres en la cabecera del fichero de código, utilizando la palabra clave Imports, como se muestra en el Código fuente 230.

' debemos importar el espacio de nombres ' o no podremos instanciar objetos de las ' clases que contiene Imports ConsoleApplication1.Personal

Module Module1 Sub Main() ' como hemos importado el espacio de nombres Personal ' podemos instanciar un objeto de su clase Empleado Dim loEmp As Empleado loEmp = New Empleado() loEmp.piID = 5 loEmp.MostrarDatos()

Console.ReadLine() End Sub End Module

Código fuente 230

Si no utilizamos Imports, también podemos instanciar objetos de clases halladas en espacios de nombres distintos, utilizando en este caso la sintaxis calificada, es decir, escribimos en primer lugar el espacio de nombres, un punto y la clase. El inconveniente de esta forma de codificación, reside en que cada vez que declaremos e instanciemos un objeto tenemos que emplear esta sintaxis calificada, por lo cuál, es mucho más cómodo importar el espacio de nombres al comienzo del fichero. Ver Código fuente 231.

Dim loEmp As Personal.Empleado loEmp = New Personal.Empleado()

Código fuente 231

Finalmente, vamos a agregar una nueva clase al proyecto, a la que daremos el nombre GESTION.VB. Sin embargo no utilizaremos la clase que crea por defecto, borraremos todo el código de ese fichero y escribiremos dos nuevas clases en él: Cuenta y Balance, que además, estarán contenidas en el espacio

de nombres Contabilidad. De esta forma queda demostrado como podemos organizar nuestro código, además de en clases, en espacios de nombre que contengan clases con funcionalidades similares. Ver Código fuente 232.

Namespace Contabilidad Public Class Cuenta Public piCodigo As Integer

Public Function Obtener() As Integer Return Me.piCodigo End Function

End Class

Public Class Balance Public psDescripcion As String

Programación con Visual Basic .NET © Grupo EIDOS

Public Sub MostrarDescrip() Console.WriteLine("La descripción del balance es: {0}", Me.psDescripcion) Console.ReadLine() End Sub End Class End Namespace

Código fuente 232

El modo de instanciar, desde Main( ), objetos de las clases del espacio de nombres Contabilidad, es exactamente el mismo que hemos descrito para el espacio de nombres Personal: bien importamos el espacio de nombres, o empleamos los nombres calificados. Veamos el Código fuente 233.

Imports ConsoleApplication1.Contabilidad

Module Module1 Sub Main() ' instanciamos con sintaxis calificada Dim loCuen As New Contabilidad.Cuenta() Dim liDatoCuenta As Integer loCuen.piCodigo = 158 liDatoCuenta = loCuen.Obtener()

' al haber importado el espacio de nombres ' podemos instanciar usando el nombre ' de la clase directamente Dim loBal As Balance loBal = New Balance() loBal.psDescripcion = "Resultado trimestral" loBal.MostrarDescrip()

Console.ReadLine() End Sub End Module

Código fuente 233

Una cualidad muy de agradecer cuando escribimos clases dentro de espacios de nombre, reside en que podemos tener las clases de un mismo espacio de nombres diseminadas por todo el código de la aplicación. Por ejemplo, en el módulo Module1 hemos definido el espacio de nombres Personal, y creado en su interior la clase Empleado; pues bien, si añadimos otra clase al proyecto, podemos incluir también esta clase en el espacio de nombres Personal, a pesar de que dicho código se encuentre en otro fichero distinto. Ver Código fuente 234.

Namespace Personal Public Class Proveedor Public psID As Integer Public psDescrip As String

Public Sub MuestraProv() Console.WriteLine("El proveedor tiene el código" & _ " {0} y la descripción {1}", Me.psID, Me.psDescrip) End Sub End Class

© Grupo EIDOS 18. Métodos y espacios de nombre

End Namespace

Código fuente 234

Cuando importemos el espacio de nombres Personal, todas las clases que contiene pasarán a estar disponibles, con independencia del fichero de código que las contenga.