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.

(Bild: Pincasso/Shutterstock)
- 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.
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.
(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)