TOC

This article has been localized into Spanish by the community.

Clases:

Namespaces (Espacios de nombres)

En uno de los primeros artículos, discutimos brevemente los namespaces (espacios de nombres). Probablemente reconozcas la palabra-clave, ya que se encuentra en la mayoría de los archivos que contienen código C#, generalmente al principio de los mismos. Un espacio de nombres es esencialmente una forma de agrupar un conjunto de tipos, por ejemplo clases, en un espacio nominado propio. Cuando Visual Studio genera un nuevo proyecto, también genera un espacio de nombres por defecto en el cual coloca tu primer archivo (al menos esto es cierto para el tipo de proyecto Aplicación de Consola). Podría verse así:

using System;  

namespace MyProject  
{  
    class Program  
    {  
static void Main(string[] args)  
{  
// More code below this....

En este caso, el espacio de nombres "MyProject" ahora es parte de la aplicación y cuando utilices sus clases fuera de este, tendrás que poner su nombre como prefijo del nombre de la clase. Veras lo mismo cuando quieras usar algo que esta enterrado en el framework .NET, cómo esto:

System.IO.File.ReadAllText("test.txt");

En este caso, usamos el método ReadAllText() de la clase File que existe en el espacio de nombres System.IO. Por supuesto, sería tedioso escribir un nombre tan largo cada vez que quieras usar una clase de un espacio de nombres, asi que C# te permite "importar" un espacio de nombres entero en el ámbito de tu archivo con una sentencia using. De nuevo, ya la deberías conocer, dado que normalmente la puedes encontrar al principio de tus archivos C#. Para el ejemplo mas arriba, si necesitáramos la clase File más de una vez, tendría sentido importar el espacio de nombres System.IO con una sentencia using de este modo:

using System;
using System.IO;
// More using statements here...

¿Por qué se necesitan espacios de nombres?

Si recién comienzas a programar, podrías preguntarte para qué necesitamos espacios de nombres. ¿Por qué no simplemente poner todas tus clases en el mismo espacio de nombres de modo que sean siempre accesibles? Tienes un punto válido, pero solo si tu proyecto es muy pequeño. A medida de que comiences a agregar mas y mas clases, tendrá mucho sentido separarlas en espacios de nombres. Simplemente hace mas fácil que encuentres tu código, especialmente si ubicas tus archivos en carpetas correspondientes - de hecho, si tu agregas una carpeta a tu proyecto y luego agregas una clase a la misma, Visual Studio automáticamente la pondrá en un espacio de nombres correspondiente. Así, si creas una carpeta en MyProject llamada MyFolder, las clases agregadas a esta carpeta serán, por defecto, ubicadas en un espacio de nombres llamado MyProject.MyFolder.

Un gran ejemplo de por qué los espacios de nombres se necesitan es el mismo framework .NET. Solo piensa si TODAS las clases del framework estuvieran simplemente flotando en un espacio de nombres global - sería un enredo! En cambio, las organizaron bien, con System como el espacio de nombres raíz para la mayoría de las clases y luego subespacios de nombres como System.IO para clases de entrada/salida, System.Net para clases relacionadas con redes y System.Net.Mail para clases relacionadas com mail (correo).

Conflictos de nombres con espacios de nombres

Como mencioné, los espacios de nombres también sirven para encapsular tus tipos (usualmente clases), de modo que puedan existir dentro de su propio dominio. Esto también significa que eres libre de crear clases con el mismo nombre que las que se encuentren en cualquier otro lugar en tu proyecto o incluso en el framework .NET. Por ejemplo, podrías decidir que necesitas una clase File propia. Como vimos en los ejemplos anteriores, tal clase ya existe en el espacio de nombres System.IO, pero eres libre de crear una en tu propio espacio de nombres, así:

using System;  

namespace MyProject.IO  
{  
    class File  
    {  
public static void HelloWorld()  
{  
    Console.WriteLine("Hello, world!");  
}  
    }  
}

Ahora cuando quieras usarla en tu proyecto, por ejemplo en tu método Main de Program.cs (si estás trabajando en una aplicación de consola, como yo), puedes escribir el nombre completo:

MyProject.IO.File.HelloWorld();

Pero también puedes importar el espacio de nombres, igual que con cualquier otro espacio de nombres (interno o definido por usuario), gracias a la sentencia using. Aquí hay un ejemplo más completo:

using System;
using MyProject.IO;

namespace MyProject
{
    class Program
    {
static void Main(string[] args)
{
    File.HelloWorld();
}
    }
}

¡Hasta ahora, todo bien! Sin embargo, ¿qué pasa si también quieres usar la clase File del espacio de nombres System.IO? Bueno, acá es donde comienzan los problemas, porque si importas también ese espacio de nombres, con una sentencia using, el compilador ya no sabrá a cuál clase File te estás refiriendo - la nuestra o la del espacio de nombres System.IO. Ésto se puede resolver importando solo uno de los espacios de nombres (idealmente el que tenga los tipos que mas uses) y luego usar el nombre completo del otro, como en este ejemplo:

using System;
using System.IO;

namespace MyProject
{
    class Program
    {
static void Main(string[] args)
{
    MyProject.IO.File.HelloWorld();
}
    }
}

Pero es un poco engorroso escribir cada vez, especialmente si tu clase está profundamente anidada en espacios de nombres, por ejemplo MyProject.FileStuff.IO.File. Por suerte, C# tiene una solución para eso.

La directiva Using Alias

Para acortar el nombre del espacio de nombres, puedes importar el espacio de nombres bajo un nombre diferente, con una directiva Using Alias. Observa como lo hago en el siguiente ejemplo:

using System;
using System.IO;
using MyIO = MyProject.IO;

namespace MyProject
{
    class Program
    {
static void Main(string[] args)
{
    File.ReadAllText("test.txt");
    MyIO.File.HelloWorld();
}
    }
}

La magia ocurre en la tercera línea, donde cojo el espacio de nombres MyProject.IO y le doy un nombre más corto (MyIO), que luego se puede usar cuando queremos acceder a los tipos desde él. En este punto, no estamos ahorrando muchas pulsaciones de teclas, pero nuevamente debería imaginar nombres y niveles de espacios de nombres aún más largos, y créanme, pueden ser bastante largos y anidados.

Resumen

Los espacios de nombres te dan la oportunidad de encapsular tus tipos en "named spaces", que te permiten estructurar mejor tu código, así como tener múltiples clases con el mismo nombre, en tanto existan en espacios de nombres separados.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!