Quantcast
Viewing all articles
Browse latest Browse all 2708

Variable not found: Declaración de espacios de nombre en una línea con file-scoped namespaces de C#10

Image may be NSFW.
Clik here to view.
.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.


Viewing all articles
Browse latest Browse all 2708