HOWTO · Csharp
typedef-Äquivalent in C#
Erfahren Sie, wie using-Aliase das typedef-Konzept in C# ersetzen, mit Tupel-Aliasen ab C# 12 und gewöhnlichen Aliasen für generische Typen.
Auf dieser Seite
C# besitzt kein Schlüsselwort typedef. Das nächste Gegenstück ist ein using-Alias, der einem vorhandenen Namespace oder Typ innerhalb einer Datei einen kürzeren Namen gibt.
Ein Alias verbessert die Lesbarkeit, erzeugt aber keinen neuen Laufzeittyp. Verwenden Sie eine Klasse, einen Record oder eine Struktur, wenn Sie einen eigenen Typ mit Verhalten oder Validierung benötigen.
Einen using-Alias für einen vorhandenen Typ verwenden
Setzen Sie den Alias zu den anderen using-Direktiven an den Anfang der Datei und verwenden Sie ein vollständig qualifiziertes Ziel. So hängt der Alias nicht von einer anderen Direktive ab.
Beispielsweise benennt using RouteTable = System.Collections.Generic.Dictionary<string, System.Collections.Generic.List<int>>; einen vorhandenen geschlossenen generischen Typ.
RouteTable ist nur eine kürzere Schreibweise für Dictionary<string, List<int>>. Der Alias fügt keine Typsicherheit hinzu und erstellt keine neue Deklaration. Ein gewöhnlicher Alias gilt in der gesamten Quelldatei, nicht automatisch im ganzen Projekt.
Die bekannten using-Formen haben unterschiedliche Aufgaben: using System.Text; importiert einen Namespace, using static System.Math; importiert statische Member, und using RouteTable = ...; erstellt einen Alias.
C#-12-Tupel-Aliase und Aliase für generische Typen
C# 12 erweiterte using-Aliase auf zuvor unbenannte Typen wie Tupel. Gewöhnliche Aliase für benannte und konstruierte generische Typen wurden bereits vorher unterstützt. Das folgende Beispiel verwendet beide Formen:
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
Dieser Erfolgsfall wurde in einer isolierten, netzwerkfreien .NET-10.0.401-Umgebung wiederhergestellt und erstellt. Das Projekt wurde in temporären Container-Speicher kopiert, mit --ignore-failed-sources wiederhergestellt und ausgeführt, ohne Fixture oder Image zu ändern.
Wenn das Projekt C# 11 oder eine ältere Sprachversion verwendet, sind Aliase für beliebige Typformen nicht automatisch verfügbar. Aktualisieren Sie die Toolchain oder schreiben Sie den vollständigen Typ aus. Aliase für benannte Typen gibt es bereits länger.
Was ein Alias nicht tut
Ein Alias ist kein eigenständiger typedef-artiger Typ. RouteTable und der vollständige Dictionary-Typ sind beim Kompilieren austauschbar. Für Werte, die nicht versehentlich mit anderen Werten vertauscht werden sollen, benötigen Sie einen echten Record- oder Strukturtyp.
Ein Tupel-Alias benennt lediglich eine Tupelform. Er macht daraus keine benannte Klasse. Elementnamen verbessern Zugriff und Dokumentation, liefern aber keine unabhängige Typidentität.
Nullable-Referenztypen sind eine Grenze
Die erweiterte Alias-Grammatik hat weiterhin Einschränkungen. Ein oberster Nullable-Referenztyp ist kein zulässiges Aliasziel. using MaybeName = string?; ist deshalb absichtlich ungültig.
Der Compiler weist diese Aliasdeklaration zurück, weil string? eine Nullable-Referenzannotation und an dieser Stelle kein erlaubtes Aliasziel ist. Das Boundary-Fixture muss mit einem Kompilierungsfehler enden; es ist diagnostischer Nachweis und keine lauffähige Lösung.
Wann ein echter Typ sinnvoll ist
Wählen Sie Klasse, Record oder Struktur, wenn der Name ein eigenes Konzept darstellen soll. Das gilt für Invarianten, Validierung, Methoden, kontrollierte Konstruktion, Gleichheitssemantik oder eine öffentliche API. Ein using-Alias passt dagegen zu einer kürzeren, dateilokalen Schreibweise.
Die offiziellen Details finden Sie in der Microsoft-Dokumentation zur using-Direktive, zu C# 12 und zum Using-Alias-Vorschlag.
FAQ
- Unterstützt C#
typedef? Nein. Verwenden Sie einenusing-Alias oder einen echten Typ. - Kann ein Alias ein Tupel benennen? Ja, ab C# 12.
- Gilt ein Alias in jeder Datei? Nein, ein normaler Alias gilt nur in seiner Datei.
- Erzeugt ein Alias einen neuen Typ? Nein, er verweist auf den vorhandenen Typ.
- Warum schlägt
using MaybeName = string?;fehl? Ein oberster Nullable-Referenztyp ist als Aliasziel verboten.