HOWTO · Csharp

Equivalente de typedef en C#

Aprende a usar alias using como equivalente de typedef en C#, con alias de tuplas desde C# 12 y alias normales para tipos genéricos.

En esta página

C# no tiene la palabra clave typedef. La alternativa más cercana es un alias using, que asigna un nombre local al archivo a un espacio de nombres o tipo existente.

Un alias mejora la legibilidad, pero no crea un tipo nuevo en tiempo de ejecución. Usa una clase, un record o una estructura cuando necesites un tipo propio con comportamiento o validación.

Usar un alias using para un tipo existente

Coloca el alias junto a las demás directivas using al principio del archivo y usa un destino totalmente cualificado. Así el alias no depende de otra directiva.

Por ejemplo, using RouteTable = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>; da nombre a un tipo genérico cerrado existente.

RouteTable solo es una forma abreviada de Dictionary<string, List<int>>. No añade seguridad de tipos ni crea una declaración nueva. Un alias normal está disponible en todo el archivo fuente, no automáticamente en todo el proyecto.

Las formas conocidas de using tienen funciones distintas: using System.Text; importa un espacio de nombres, using static System.Math; importa miembros estáticos y using RouteTable = ...; crea un alias.

Alias de tuplas de C# 12 y alias de tipos genéricos

C# 12 amplió los alias using para admitir tipos que antes no tenían nombre, como las tuplas. Los alias normales para tipos con nombre y tipos genéricos construidos ya eran compatibles. El ejemplo siguiente usa ambas formas:

using RouteTable = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>;
using Coordinate = (double Latitude, double Longitude);

RouteTable routes = new() { ["home"] = [1, 2] };
Coordinate point = (52.37, 4.90);

System.Console.WriteLine($"{routes["home"].Count}:{point.Latitude:F2}");
2:52.37

Este caso correcto se restauró y compiló en un entorno .NET 10.0.401 aislado y sin red. El proyecto se copió al almacenamiento temporal del contenedor, se restauró con --ignore-failed-sources y se ejecutó sin cambiar el fixture ni la imagen.

Si el proyecto usa C# 11 o una versión anterior, no supongas que los alias de formas arbitrarias compilarán. Actualiza la herramienta o escribe el tipo completo. El alias de tipos con nombre existe desde antes de C# 12.

Lo que un alias no hace

Un alias no es un tipo distinto al estilo de typedef. RouteTable y el tipo Dictionary completo son intercambiables al compilar. Si un valor no debe confundirse con otro, necesitas un tipo de dominio real, como un record o una estructura.

Del mismo modo, un alias de tupla solo da un nombre legible a una forma de tupla; no la convierte en una clase con nombre. Los nombres de los elementos ayudan a leer el código, pero no proporcionan identidad de tipo independiente.

Los destinos de referencia anulable son un límite

La gramática ampliada de alias mantiene restricciones. Un tipo de referencia anulable de nivel superior no puede ser el destino de un alias. Por eso using MaybeName = string?; es intencionadamente inválido.

El compilador rechaza esa declaración porque string? es una anotación de referencia anulable y no un destino permitido en esa posición. El fixture de límite debe fallar al compilar; es evidencia del diagnóstico, no una solución ejecutable.

Cuándo definir un tipo real

Elige una clase, un record o una estructura cuando el nombre deba representar un concepto distinto. Es apropiado para invariantes, validación, métodos, construcción controlada, igualdad o una API pública. Usa un alias cuando solo necesites una escritura más corta y local al archivo.

Consulta la documentación oficial de Microsoft sobre la directiva using, C# 12 y la propuesta de alias using.

Preguntas frecuentes

  1. ¿C# admite typedef? No. Usa un alias using o un tipo real.
  2. ¿Puede un alias nombrar una tupla? Sí, desde C# 12.
  3. ¿Está disponible el alias en todos los archivos? No, un alias normal solo vive en su archivo.
  4. ¿Crea un tipo nuevo? No, apunta al tipo existente.
  5. ¿Por qué falla using MaybeName = string?;? Un tipo de referencia anulable de nivel superior está prohibido como destino.