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.
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)