Neu in .NET 8.0 [5]: Typaliasse in C# 12.0

Typen können in der aktuellen Version von C# durch das Schlüsselwort using einen alternativen Namen erhalten.

In Pocket speichern vorlesen Druckansicht 6 Kommentare lesen

(Bild: Piyawat Nandeenopparit / Shutterstock.com)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Seit C#-Sprachversion 12.0 gibt es mit Typaliassen die Möglichkeit, für einen Typen einen alternativen Namen zu definieren. Typen können dabei C#-Typen, NET-Basisklassen/-Strukturen oder eigene Klassen/Strukturen sein.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Das in C# schon mehrfach verwendete Schlüsselwort using erhält dabei eine weitere Bedeutung.

Wenn man schreibt

using Numbers = int[];

kann man fortan Numbers anstelle von int[] bei Typdeklarationen verwenden:

Numbers numbers = new int[10];

Allerdings darf man den Alias nicht bei der Instanziierung verwenden:

Numbers numbers = new Numbers; 

Auch kann man leider keinen Alias mithilfe eines Alias definieren. Folgendes ist somit ebenfalls nicht erlaubt:

using DbIntList = List<DbInt>;

Zweites Beispiel: DbInt als Alias für ein int? Nullable<int>:

using DbInt = int?;

// ermöglicht:

public DbInt LoadNumberFromDatabase()
{
 try
 {
  …
 }
 catch (Exception)
 {
  return null;
 }
}

DbInt n;
n = LoadNumberFromDatabase();
Console.WriteLine(n == null ? "null" : n);

Drittes Beispiel: Typalias für ein Tupel

using Measurement = (string Units, int Distance);

// ermöglicht:

public Measurement Add(Measurement m1, Measurement m2)
{
 if (m1.Units == m2.Units)
 {
  return (m1.Units, m1.Distance + m2.Distance);
 }
 else
 {
  throw new Exception("Units do not match!");
 }
}
…
Measurement m1 = ("m", 100);
Console.WriteLine(m1.Distance + " " + m1.Units);
 
Measurement m2 = ("m", 42);
Console.WriteLine(m2.Distance + " " + m2.Units);
 
Measurement m3 = Add(m1, m2);
Console.WriteLine(m3);

Viertes Beispiel: Typalias für eine .NET-Klasse

using MyPerson = BO.Person;

Anders als beim Int-Array-Alias numbers ist hier eine Verwendung bei der Instanziierung gestattet:

MyPerson p = new MyPerson();
MyPerson[] pArray = new MyPerson[10];

Ein Typalias muss am Beginn einer Datei außerhalb von allen Typimplementierungen (Klassen, Strukturen) stehen. Er darf vor oder nach den using-Anweisungen für Namensraumimporte und vor oder nach der Namensraumdeklaration stehen. Ausnahme: Wenn der Typalias nicht nur für eine Datei, sondern alle Dateien im Projekt gelten soll, dann muss der Alias vor dem Namensraum stehen und zusätzlich das Schlüsselwort global besitzen. Ein Typalias kann nicht für andere Projekte exportiert werden. Er muss in jedem .NET-Projekt einmal deklariert sein, wenn er verwendet wird.

global using Measurement = (string Units, int Distance);
using BO;

namespace BL;

// Typaliasse dürfen im Namensraum stehen
using Numbers = int[];
using DbInt = int?;
using MyPerson = Person;
 
class MeineKlasse
{
…
}

(rme)