Espacios de nombres.

Al igual que en un sistema operativo las carpetas ayudan a organizar los archivos en un disco duro, en C# los espacios de nombres ayudan a organizar las clases. De esta manera se evitan posibles conflictos en el caso de iguales nombres de clases o métodos pero de distintos fabricantes, programadores o incluso el mismo Framework, ya que se diferencian entre ellos por el distinto espacio de nombres en que están incluidos.

Según lo anterior, un espacio de nombres define un ámbito único que permite la creación de tipos globalmente únicos reunidos en conjuntos en función de la labor que desempeñen. Al igual que, por ejemplo, en nuestro disco duro tenemos una carpeta que se llama 'Fotos' en la cual guardamos únicamente fotografías, en C# crearemos nuestros propios espacios de nombres que contendrán clases que realizarán tareas enfocadas a una misma problemática. Al igual que no se nos ocurriría guardar documentos de texto en esa carpeta 'Fotos' del disco duro, pues su localización sería un problema, tampoco se nos ocurrirá guardar clases en un ámbito de espacio de nombres diferente al que por naturalidad le correspondería. En el Framework, por ejemplo, el espacio de nombres 'System.IO' contiene los elementos necesarios para el trabajo con archivos, y únicamente ese tipo de elementos; evidentemente, los programadores de Microsoft no han incluido clases de trabajo matemático en el espacio de nombres 'System.IO', porque de manera natural no sería allí donde iríamos a burcarlas, sino al espacio de nombres 'System.Math'.

Hay que tener en cuenta que los espacios de nombres deben estar creados de una manera jerárquica. Por ejemplo, dentro de nuestra carpeta del disco duro 'Fotos', tendremos otras subcarpetas que podrían ser 'Fotos de viajes', 'Fotos de familia', etc. De la misma forma, el Framework posee espacios de nombres creados con una jerarquía muy estricta, y todos tienen como espacio de nombre original el 'System'. De él derivan, por ejemplo, 'System.IO', 'System.Windows', 'System.Windows.Forms', 'System.Web', 'System.Web.UI', etc.

Para la creación de un espacio de nombres se utiliza la palabra 'namespace'. Elsiguiente código fuente crea un espacio de nombres 'System' que empaqueta las clases 'ClassA' y 'ClassB' y el espacio de nombres 'Windows', que a su vez empaqueta el espacio de nombres 'Forms' que incluye las clases 'ClassC' y 'ClassD':

namespace System
{
    class ClassA { }
    class ClassB { }
    namespace Windows
    {
        namespace Forms
        {
            class ClassC { }
            class ClassD { }
        }
    }
}

Teniendo en cuenta que el espacio de nombres 'Windows' no tiene ninguna clase, la simplificación lógica de lo anterior sería lo siguiente:

namespace System
{
    class ClassA { }
    class ClassB { }
    namespace Windows.Forms
    {
        class ClassC { }
        class ClassD { }
    }
}

En todos los ejemplos vistos hasta ahora, cuando invocábamos al método 'WriteLine' de la clase 'Console' lo hacíamos con la expresión completa 'System.Console.WriteLine', en la cual especificábamos el espacio de nombres en el cual está incluida la clase 'Console' De la misma manera, en el ejempo anterior, para invocar a la clase 'ClassA' lo haremos con la expresión 'System.ClassA', y para invocar a la clase 'ClassC' lo haremos con la expresión 'System.Windows.Forms.ClassC'.

Directriz 'using'.

Es muy elevado el número de clases contenidas en el Framework, por lo que sería muy tedioso la escritura de las rutas completas de los espcios de nombres cada vez que deseamos invocar un método de una clase. Para ello existe la directriz 'using', que actúa como una abreviación a la hora de las invocaciones.

using System;
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Usando directriz 'using'.");
        Console.ReadKey();
    }
}

Como ves, ahora en el memoento de la invocación de los métodos 'WriteLine' y 'ReadKey' ya no hemos incluido el espacio de nombres 'System' porque ya ha sido incluido por la directriz 'using', y no será necesario para ninguna invocación de todos y cada uno de los métodos contenidos en las clases pertenecientes al espacio de nombres 'System'. Es un ahorro de trabajo considereable a la hora de acceder a los elementos del Framework y, con el tiempo, cuando tus programas sean muy extensos, será también un ahorro a la hora de invocar tus métodos contenidos en tus propios espacios de nombres.

Además, es posible establecer tantas directrices 'using' como espacios de nombres deseemos incluir:

using System;
using System.IO;
public class Program
{
    public static void Main()
    {
        Console.WriteLine("Usando directriz 'using'.");
        Directory.CreateDirectory("C:\CarpetaEspecial");
        Console.ReadKey();
    }
}

En este caso, similar al anterior, hemos incluido también el espacio de nombres 'System.IO', a través del cual tenemos acceso directo a la clase 'Directory' perteneciente a dicho espacio de nombres, e invocamos al método 'CreateDirectory' para crear una carpeta llamada "CarpetaEspecial" en la raíz del disco duro. Nos hemos ahorrado pues, en las dos líneas del método 'Main', el tener que teclear 'System.' y 'System.IO.'.