Neu in .NET 8.0 [4]: Collection Expressions in C# 12.0

Das aktuelle Release der Programmiersprache C# vereinfacht das Initialisieren von Collections wie Listen.

In Pocket speichern vorlesen Druckansicht

(Bild: Pincasso/Shutterstock)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Eine sehr schöne Neuerung ab C# 12.0 ist die vereinfachte Syntax für die Initialisierung von Mengen. Microsoft nannte dieses Sprachfeature ursprünglich Collection Literals, jetzt aber Collection Expressions.

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.

Mit dieser neuen Syntax kann man die bisher sehr heterogene Initialisierungsformen von Objektmengen stark vereinheitlichen im Stil von JavaScript, also mit den Werten in eckigen Klammern, getrennt durch Kommata:

Bisherige Initialisierung Nun auch möglich
int[] a = new int[3] { 1, 2, 3 }; int[] a = [1,2,3];     
Span<int> b = stackalloc[] { 1, 2, 3 }; Span<int> b = [1,2,3];  
ImmutableArray<int> c = ImmutableArray.Create(1, 2, 3); ImmutableArray<int> c = [1,2,3];
List<int> d = new() { 1, 2, 3 }; List<int> d = [1,2,3];   
IList<int> e = new List<int>() { 1, 2, 3 }; IList<int> e = [1, 2, 3];
IEnumerable<int> f = new List<int>() { 1, 2, 3 }; IEnumerable<int> f = [1,2,3];   
Es entsteht dabei aber ein Objekt vom Typ ReadOnlyArray<int>!

Die Syntax mit den eckigen Klammern ist nicht nur bei der Erstinitialisierung, sondern auch bei späteren Zuweisungen möglich:

List<string> sites1, sites2 = ["www.IT-Visions.de"], sites3;
sites1 = ["www.dotnetframework.de", "www.dotnet8.de", 
          "dotnet-lexikon.de", "www.dotnet-doktor.de"];
sites3 = []; // leere Liste

Mit dem Spread-Operator .. kann man im Rahmen der Initialisierung Mengen in andere Mengen integrieren. Der Spread-Operator sorgt dafür, dass keine verschachtelte, sondern eine flache Liste entsteht:

// Array aus den Elementen der Arrays erstellen mit Spread Operator
string[] allSitesAsArray = 
  [.. sites1, .. sites2, "www.dotnettraining.de", .. sites3];
// Liste aus den Elementen der Arrays erstellen mit Spread Operator
List<string> allSitesAsList = 
  [.. sites1, .. sites2, "www.dotnettraining.de", .. sites3];

// Liste noch mal erweitern
allSitesAsList = [.. allSitesAsList, "powershell-schulungen.de"];

// Auflisten: 7 Sites sind nun in der Liste
foreach (var site in allSitesAsList)
{
 Console.WriteLine(site);
}

Es entsteht eine Menge mit diesen acht Websites, denn neben den sieben in den Variablen sites1, sites2 und sites3 enthaltenen Websites wurde noch eine weitere Website hinzugefügt.

Ausgabe des vorherigen Listings

(Bild: Screenshot / Holger Schwichtenberg)

Collection Expressions sind bisher (Stand C# 12.0) nicht für Dictionary-Objekte möglich. Bei diesen kann man (wie vor C# 12.0) die Initialisierung wahlweise über verschachtelte geschweifte Klammern verwenden oder aber innerhalb der geschweiften Klammen die Name-Wert-Zuweisung per [Name] = Wert erledigen:

  // Initialisierung mit Add()
  SortedDictionary<int, string> dic0 = new();
  dic0.Add(10, "www.dotnet-doktor.de");
  dic0.Add(21, "www.dotnetframework.de");
  dic0.Add(42, "www.dotnet8.de");

  // Initialisierung mit geschweiften Klammern
  SortedDictionary<int, string> dic1 = new() {
   { 10, "www.dotnet-doktor.de" }, 
   { 21, "www.dotnetframework.de" },  
   { 42, "www.dotnet8.de" } 
  };

  // Initialisierung mit geschweiften und eckigen Klammern
  // (schon vor C# 12.0 möglich)
  SortedDictionary<int, string> dic2 = new()
  {
   [10] = "www.dotnet-doktor.de",
   [21] = "www.dotnetframework.de",
   [42] = "www.dotnet8.de"
  };

(rme)