Anuncios
Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre los namespace o espacio de nombres en C#, este se utiliza de una forma similar a su homonimo de C pero tambien tiene algunas caracteristicas propias.

Este mecanismo fue diseñado para mantener un conjunto de nombres separados de otro, evitando que los nombres declarados en un namespace entre en conflicto con los nombres declarados en otra clase, su sintaxis es la siguiente:

namespace nombre 
{
    ... instrucciones ...
}

Dentro del namespace podemos declarar una clase donde tendra sus propios metodos y propiedades, siendo completamente independiente de la clase donde este siendo definida, inclusive podemos definir mas de un namespace, veamos el siguiente ejemplo:

namespace.cs

using System;

namespace primero
{
    class nombreespacio
    {
        public void func()
        {
            Console.WriteLine("Primer namespace");
        }
    }
}

namespace segundo
{
    class nombreespacio
    {
        public void func()
        {
            Console.WriteLine("Segundo namespace");
        }
    }
}

public class Program
{
    static int Main()
    {
        primero.nombreespacio pc = new primero.nombreespacio();
        segundo.nombreespacio sc = new segundo.nombreespacio();

        pc.func();
        sc.func();
        
        return 0;
    }
}
Anuncios

En este codigo vamos a crear dos namespaces, veamos uno:

namespace primero
{
    class nombreespacio
    {
        public void func()
        {
            Console.WriteLine("Primer namespace");
        }
    }
}
Anuncios

En este caso vamos a crear un namespace llamado primero dentro del bloque crearemos una clase llamada nombreespacio y dentro de esta clase crearemos una funcion llamada func y que mostrara un mensaje, luego crearemos otro namespace exactamente igual pero va a tener dos diferencias:

  • la primera es el nombre ya que se llamara segundo
  • cambiaremos el mensaje del func que se encuentra dentro

Luego crearemos una clase con la funcion Main para que pueda ser ejecutada, veamos ese bloque:

public class Program
{
    static int Main()
    {
        primero.nombreespacio pc = new primero.nombreespacio();
        segundo.nombreespacio sc = new segundo.nombreespacio();

        pc.func();
        sc.func();
        
        return 0;
    }
}
Anuncios

En este caso crearemos dos objetos de las clases que se encuentran en los namespaces que creamos antes, veamos la sintaxis de uno:

primero.nombreespacio pc = new primero.nombreespacio();
Anuncios

Primero indicamos el nombre del namespace luego con el punto pasamos el nombre de la clase despues pasaremos el nombre que tendra el objeto para luego usar el constructor exactamente igual a como indicamos en el objeto, el otro caso es identico, por ultimo llamamos a cada uno de los metodos que existen en las clases, compilemos y veamos que sucede:

C:\Users\tinchicus\Documents\Visual Studio 2019>namespace.exe
Primer namespace
Segundo namespace

C:\Users\tinchicus\Documents\Visual Studio 2019>
Anuncios

Como podemos ver podemos tener exactamente el mismo nombre de clase y de funciones pero si estan en distintos namespaces, el lenguaje sabra diferenciarlos, ahora pasaremos a explicar a using.

Anuncios

En el ejemplo anterior vimos que usamos al metodo using para que llame a System, esto nos posibilito que no llamemos al Console.WriteLine como vimos en el post anterior, es decir que este metodo nos permite pasar nombres para espacio de nombres haciendo que el lenguaje primero verifique los nombres que informamos y cuando tenga una clase o funcion busque entre los nombres que pasamos, vamos a tomar el codigo del post anterior y vamos a modificarlo de esta forma:

hola.cs

using System;

public class Program
{
	static int Main()
	{
		Console.WriteLine("Hola, Mundo!");
		return 0;
	}
}
Anuncios

Va a trabajar exactamente de la misma forma que en el post anterior pero con la diferencia de que ahora podemos llamar al Console.WriteLine sin la necesidad de especificar a la clase (o namespace) llamada System porque al tenerlo por medio de using sabe que primero buscara ahi el nombre relacionado a Console, para dejar mas claro este ejemplo vamos a tomar el codigo anterior y modificarlo de la siguiente manera:

using System;
using primero;
using segundo;

namespace primero
{
    class clase1
    {
        public void func()
        {
            Console.WriteLine("Primer namespace");
        }
    }
}

namespace segundo
{
    class clase2
    {
        public void func()
        {
            Console.WriteLine("Segundo namespace");
        }
    }
}

public class Program
{
    static int Main()
    {
        clase1 pc = new clase1();
        clase2 sc = new clase2();

        pc.func();
        sc.func();
        
        return 0;
    }
}
Anuncios

En este caso primero agregaremos dos nuevos using con los nombres de los namespaces de nuestro codigo, pero como ahora nosotros podemos omitir el nombre de nuestros namespaces deberemos renombrar a las clases con diferentes nombres, esto es debido a que si bien van a ser distintos lugares, los nombres de las clases no pueden ser iguales ya que creariamos una ambigüedad y por este motivo tuvimos que renombrarlo a clase1 y clase2, luego modificamos el Main donde crearemos los objetos con las nuevas clases y si lo probamos deberemos obtener el mismo resultado que antes.

Nota: Si no modificamos los nombres al compilarlo nos devolvera el siguiente mensaje:

namespace.cs(31,9): error CS0104: 'nombreespacio' es una referencia ambigua
entre 'primero.nombreespacio' y 'segundo.nombreespacio'
namespace.cs(7,11): (Ubicación del símbolo relacionado con el error anterior)
namespace.cs(18,11): (Ubicación del símbolo relacionado con el error anterior)
namespace.cs(31,32): error CS0104: 'nombreespacio' es una referencia ambigua
entre 'primero.nombreespacio' y 'segundo.nombreespacio'
namespace.cs(7,11): (Ubicación del símbolo relacionado con el error anterior)
namespace.cs(18,11): (Ubicación del símbolo relacionado con el error anterior)
namespace.cs(32,9): error CS0104: 'nombreespacio' es una referencia ambigua
entre 'primero.nombreespacio' y 'segundo.nombreespacio'
namespace.cs(7,11): (Ubicación del símbolo relacionado con el error anterior)
namespace.cs(18,11): (Ubicación del símbolo relacionado con el error anterior)
namespace.cs(32,32): error CS0104: 'nombreespacio' es una referencia ambigua
entre 'primero.nombreespacio' y 'segundo.nombreespacio'
namespace.cs(7,11): (Ubicación del símbolo relacionado con el error anterior)
namespace.cs(18,11): (Ubicación del símbolo relacionado con el error anterior)
Anuncios

Como pueden ver ahora nos quedo un codigo un poco mas limpio pero puede que sea un poco mas confuso y a su vez hemos perdido la posibilidad de repetir mas nombres, pero nosotros tambien podemos anidar namespaces, vamos a tomar nuevamente el codigo anterior y lo modificaremos de la siguiente manera:

using System;
using primero;
using primero.segundo;

namespace primero
{
    class clase1
    {
        public void func()
        {
            Console.WriteLine("Primer namespace");
        }
    }

    namespace segundo
    {
        class clase2
        {
            public void func()
            {
                Console.WriteLine("Segundo namespace");
            }
        }
    }
}

public class Program
{
    static int Main()
    {
        clase1 pc = new clase1();
        clase2 sc = new clase2();

        pc.func();
        sc.func();
        
        return 0;
    }
}
Anuncios

Basicamente el codigo es muy parecido al anterior pero con un par de diferencias, vamos a ver la primera de ellas:

namespace primero
{
    class clase1
    {
        public void func()
        {
            Console.WriteLine("Primer namespace");
        }
    }

    namespace segundo
    {
        class clase2
        {
            public void func()
            {
                Console.WriteLine("Segundo namespace");
            }
        }
    }
}
Anuncios

En este bloque tenemos el namespace primero con su clase interna pero seguido insertamos el segundo namespace con todos sus datos, entonces nuestro segundo using ya no funciona por ende podemos hacer dos cambios, cada vez que necesitamos acceder al segundo namespace podemos usarlo de la siguiente manera:

primero.segundo.clase2 sc = new primero.segundo.clase2();

Al estar anidado no tenemos forma de ingresar directo por lo que deberemos usar su ruta completa pero tambien podemos usar la modificacion del ejemplo sin necesidad de usar todo el camino para llegar al func de clase2:

using primero.segundo;
Anuncios

Al igual que el caso anterior como usamos todo el camino ahora al invocar la funcion func sabra como encontrarla, vamos a ver todos los casos en el siguiente video

En el video vemos todo lo que explicamos anteriormente, con los errores y todo, tambien las distintas implementaciones.

Anuncios

En resumen, hoy hemos visto que son los namespaces, para que se usan, que nos facilitan, como se aplican, hablamos de using, tambien como podemos acceder a un namespace anidado, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00