Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

18 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 21 de diciembre de 2021
.NET

Parece que uno de los objetivos de C#10 es eliminar código de los archivos de código fuente de C#, simplificando su codificación y lectura. Lo hemos visto con la introducción de características como directivas using globales o los using implícitos: en ambos casos se ahorraba espacio en vertical sustituyendo los using declarados individualmente en cada archivo por directivas aplicadas de forma global al proyecto, bien de forma explícita o implícita.

En cambio, los espacios de nombre con ámbito de archivo o namespace declarations permiten ahorrar espacio en horizontal, evitando un nivel de indentación en el código que la mayoría de las veces es innecesario.

Declaración de namespaces en C#10

Según comentan en la documentación oficial, examinando archivos de código en el ecosistema de C#, se ha demostrado que más del 99% de ellos presentan una estructura similar a la siguiente, que seguro podéis reconocer muy rápidamente:

// Directivas using
...
namespace XYZ
{
    public class Something
    { 
        ... 
    }
    ... // Otros tipos definidos en el namespace
}

Esta estructura hace que casi siempre vuestro código (clases, estructuras, enums, etc.) aparezca desplazado hacia la derecha, a la altura de la primera tabulación.

En C#10 podemos eliminar este espacio extra utilizando una declaración de espacio de nombre, que tiene la siguiente pinta:

// Usings
...
namespace XYZ; // Yeah!

public class Something
{
    ...
}
... // Otros tipos definidos en el namespace

Como podéis ver, a diferencia del enfoque tradicional, ya no se trata de un bloque namespace que envuelve los elementos definidos en éste, sino en una declaración que afecta a todo el archivo C#.

Obviamente, el hecho esto tiene sus limitaciones. Por ejemplo, ya no podremos definir elementos de distintos namespaces en el mismo archivo, pero, bah, ¿quién lo hacía? 😄

Es decir, esto es válido en un único archivo .cs: dos namespaces distintos, cada uno con elementos definidos en su interior:

// C# válido en un único archivo .cs
namespace ABC
{
    public class MyClassInABC { ... }
}
namespace DEF
{
    public class MyClassInDEF { ... }
}

Sin embargo, el siguiente código fallará en compilación si lo intentamos usar en un único archivo C#:

// Error CS8954: Source file can only contain one 
//               file-scoped namespace declaration

namespace ABC;
public class ClassInABC { }

namespace DEF;
public class ClassInDEF { }

Por las mismas razones, tampoco es posible anidar namespaces usando estas declaraciones. En otras palabras, no existe un equivalente para el siguiente código:

// Válido en C#
namespace A
{
    namespace B
    {
        public class MyClass { }
    }
}

Lo más parecido que podríamos lograr sería lo siguiente:

// Válido en C#10
namespace A.B;
public class MyClass { }

En definitiva, un cambio más al lenguaje para ganar pedacitos de pantalla. Cuando empecemos a usar esto de forma intensiva seguro que echaremos de menos ese margen de la izquierda (son muchos años de costumbre) pero seguro que en poco tiempo lo habremos interiorizado y disfrutaremos del espacio ganado :)

Publicado en Variable not found.

Aún no hay comentarios, ¡sé el primero!