Usings Globales en C# 10 y .NET 6 en 10 Minutos o Menos
[[academy-video-youtube({"vid": "RWYrafpP53A", "start_time": "0", "title": "Global Usings in C# 10 and .NET 6 In 10 Minutes or Less", "creator": "Tim Corey", "length": "5m 33s"})]]
Cualquiera que haya pasado por la parte superior de un archivo C# conoce la ceremonia: una columna de declaraciones de "using" apiladas sobre cada declaración de clase, repitiéndose de un archivo a otro. Un proyecto típico incluye las mismas naciones de espacio una y otra vez, y editar todas cuando una necesita cambiar es una tarea que no paga beneficios reales. C# 10 agregó la directiva de "using" global para eliminar esa repetición a nivel del proyecto.
En su video "Global Usings en C# 10 y .NET 6 en 10 minutos o menos", Tim Corey explica qué hacen las importaciones globales, dónde colocarlas para que el equipo pueda encontrarlas y la variante estática que permite eliminar el prefijo de clase de las llamadas a miembros. También señala el problema de diseño que vale la pena tener en cuenta: importar un espacio de nombres globalmente expone todo el proyecto a cualquier nombre que viva dentro de él. Cualquiera que haya estado copiando las mismas cinco líneas de using en cada nueva clase encontrará aquí el patrón de limpieza.
El Problema de la Repetición
[0:17 - 1:50] Tim comienza con una nueva aplicación de consola .NET 6 y crea una carpeta Datos que contiene una clase PersonModel. Referenciar esa clase desde Program.cs requiere la línea using GlobalUsings.Data; esperada en la parte superior del archivo. Agregar una segunda clase que también necesita PersonModel significa agregar la misma línea using en la parte superior de ese archivo también. Con media docena de clases, la misma importación se escribe media docena de veces.
Esta es exactamente la situación para la que fue diseñado global using. Cualquier espacio de nombres, tipo, o clase estática de la que dependa todo el proyecto puede declararse una vez y ponerse a disposición de cada archivo sin la repetición por archivo.
Promoción de un Usando al Ámbito Global
[1:50 - 2:24] La sintaxis es una sola palabra clave delante de la directiva existente:
global using GlobalUsings.Data;global using GlobalUsings.Data;Esa única línea, colocada en cualquier archivo .cs en el proyecto, hace que GlobalUsings.Data esté disponible en todos los demás archivos del mismo proyecto. Las otras clases que previamente necesitaban su propia línea using para PersonModel ya no la requieren; el tipo se resuelve automáticamente. El ámbito se detiene en el límite del proyecto, por lo que hacer referencia a clases de un proyecto hermano aún necesita la referencia normal del proyecto más su propio global o usando por archivo.
Lo que esto no hace es ocultar de dónde vienen los tipos. El compilador todavía resuelve PersonModel a su espacio de nombres; el espacio de nombres simplemente está preimportado. El comportamiento en tiempo de ejecución es idéntico a escribir el mismo usando en la parte superior de cada archivo.
Centralización de Usados en Un Solo Archivo
[2:24 - 3:32] Esparcir directivas de usando global en archivos aleatorios es técnicamente válido pero operativamente desordenado. Si un nuevo miembro del equipo ve PersonModel resolver sin una importación obvia, tiene que buscar en el proyecto para encontrar dónde se hizo global. La convención en evolución es mantener todos los usandos globales en un solo archivo en la raíz del proyecto, nombrado de manera predecible como Usings.cs o GlobalUsings.cs:
// Usings.cs at the project root
global using GlobalUsings.Data;
global using System.Text.Json;
global using System.Collections.Concurrent;// Usings.cs at the project root
global using GlobalUsings.Data;
global using System.Text.Json;
global using System.Collections.Concurrent;El archivo no contiene nada más. Cualquiera que se una al proyecto sabe exactamente un lugar para mirar para ver qué está disponible globalmente. Esto encaja con espacios de nombres basados en archivos y otras características que reducen la ceremonia que han llegado en los lanzamientos recientes de C#, todos dirigidos a hacer que el código base del proyecto sea más fácil de leer de un vistazo.
Usando Global Estático para Importaciones de Métodos
[3:32 - 4:50] La directiva de usando global se combina con el formato de usando estático que se agregó anteriormente. La combinación te permite eliminar el prefijo de clase de un miembro de clase estática en todo el proyecto. El caso motivador que muestra Tim es Console.WriteLine:
global using static System.Console;global using static System.Console;Con esa única línea en el archivo centralizado de usings, Console.WriteLine("hello") se convierte simplemente en WriteLine("hello") en todas partes del proyecto. El mismo patrón funciona para ayudantes matemáticos (global using static System.Math permite escribir Sqrt(x) sin el prefijo) y para cualquier otra clase estática de la que dependa mucho tu base de código.
Esta es la forma de la que Tim es más cauteloso. Eliminar el prefijo de clase es una ganancia de legibilidad cuando los métodos son obvios, pero puede convertirse en una fuente de confusión cuando dos clases estáticas exponen métodos con el mismo nombre. Un lector que mire una llamada desnuda de WriteLine tiene que confiar en el archivo central en lugar de ver la fuente en contexto.
Cuando las Importaciones Globales se Superponen
[4:50 - 5:14] Todo el punto de los espacios de nombres es evitar que los tipos con el mismo nombre corto colisionen. Importar globalmente un espacio de nombres elimina ese buffer para todo el proyecto de una sola vez. Si tu espacio de nombres GlobalUsings.Data contiene una clase Datos y también importas globalmente System.Data, cada archivo ahora tiene que desambiguar. El costo aparece no donde ocurre el conflicto, sino en cualquier archivo futuro que quede atrapado entre ambos.
La guía de Tim es usar los usandos globales de manera deliberada, preferir espacios de nombres que sabes que el proyecto depende universalmente, y ser especialmente cuidadoso con el usando global estático. Un conjunto de inicio razonable son los espacios de nombres que cada archivo importa de todos modos; aumentar la lista más allá de eso requiere una revisión de código.
Conclusión: Menos Ceremonia, Mismo Comportamiento
[5:14 - 5:33] Los usandos globales son una característica pequeña que se traduce en beneficios a lo largo de la vida útil de un proyecto. Cada archivo que ya no lleva cinco líneas de importaciones redundantes es un archivo que se abre al código real más rápido, y una edición a un espacio de nombres compartido ocurre en un solo lugar en lugar de docenas. El mismo cuidado que se le da a los alias de tipo y la familia más amplia de usando se aplica aquí: úsalo donde la ganancia de legibilidad sea clara y mantén el archivo central lo suficientemente pequeño como para que el siguiente desarrollador pueda escanearlo de un vistazo.
Conclusión
[5:14 - 5:33] Los usandos globales reemplazan las líneas de usando por archivo con directivas para todo el proyecto, la variante global usando estático elimina el prefijo de clase de las llamadas a miembros estáticos, y un solo archivo Usings.cs en la raíz del proyecto es la convención que lo mantiene reconocible. La característica es opcional y aditiva, por lo que adoptarla en una base de código existente es incremental.
Ejemplo de Sugerencia: Cuando activas los usings implícitos a través de <ImplicitUsings>enable</ImplicitUsings> en tu .csproj, el SDK añade automáticamente un conjunto seleccionado de usings globales (como System, System.Linq, y System.Collections.Generic) sin que los escribas. Combina eso con tu propio Usings.cs para importaciones específicas del proyecto y la parte superior de cada archivo se acorta notablemente.
Mira el video completo en su canal de YouTube y obtén más información sobre la estructura moderna de proyectos de C# en la serie de Entrenamiento de 10 Minutos.

