Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010


(Nota: Estás viendo una versión del curso antigua, creada en 2009. Es recomendable que sigas la versión 2015, mucho más actualizada, con contenidos más detallados, más ejemplos y más ejercicios propuestos)

9. Otras características avanzadas de C#

9.1. Espacios de nombres

Desde nuestros primeros programas hemos estado usando cosas como "System.Console" o bien "using System". Esa palabra "System" indica que las funciones que estamos usando pertenecen a la estructura básica de C# y de la plataforma .Net.

La idea detrás de ese "using" es que puede ocurrir que distintos programadores en distintos puntos del mundo creen funciones o clases que se llamen igual, y, si se mezclan fuentes de distintas procedencias, esto podría dar lugar a programas que no compilaran correctamente, o, peor aún, que compilaran pero no funcionaran de la forma esperada.

Por eso, se recomienda usar "espacios de nombres", que permitan distinguir unos de otros. Por ejemplo, si yo quisiera crear mi propia clase "Console" para el acceso a la consola, o mi propia clase "Random" para manejo de números aleatorios, lo razonable es crear un nuevo espacio de nombres.

De hecho, con entornos como SharpDevelop o Visual Studio, cuando creamos un nuevo proyecto, el fuente "casi vacío" que se nos propone contendrá un espacio de nombres que se llamará igual que el proyecto. Esta es apariencia del fuente si usamos VisualStudio 2008:

using System; 
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Y esta es apariencia del fuente si usamos SharpDevelop 3:

using System; 
 
namespace PruebaDeNamespaces
{
    class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
 
            // TODO: Implement Functionality Here
 
            Console.Write("Press any key to continue . . . ");
            Console.ReadKey(true);
        }
    } 
}

Vamos a un ejemplo algo más avanzado, que contenga un espacio de nombres, que cree una nueva clase Console y que utilice las dos (la nuestra y la original, de System):

/*---------------------------*/
/*  Ejemplo en C#            */
/*  namespaces.cs            */
/*                           */
/*  Ejemplo de espacios de   */
/*    nombres                */
/*                           */
/*  Introduccion a C#,       */
/*    Nacho Cabanes          */
/*---------------------------*/
 
using System;
 
namespace ConsolaDeNacho {
  public class Console
  {
     public static void WriteLine(string texto)
    {
      System.Console.ForegroundColor = ConsoleColor.Blue;
      System.Console.WriteLine("Mensaje: "+texto);
    }
  }
}  
 
public class PruebaDeNamespaces
{
 
  public static void Main() 
  {
    System.Console.WriteLine("Hola");
    ConsolaDeNacho.Console.WriteLine("Hola otra vez");    
  }
}
 

Como se puede ver, este ejemplo tiene dos clases Console, y ambas tienen un método WriteLine. Una es la original de C#, que invocaríamos con "System.Console". Otra es la que hemos creado para el ejemplo, que escribe un texto modifica y en color (ayudándose de System.Console), y que llamaríamos mediante "ConsolaDeNacho.Console". El resultado es que podemos tener dos clases Console accesibles desde el mismo programa, sin que existan conflictos entre ellas. El resultado del programa sería:


Hola
Mensaje: Hola otra vez