Înainte de C# 12, inițializarea diferitelor tipuri de colecții necesita sintaxe complet divergente și inconsecvente: new int[] { 1, 2 } pentru vectori, new List<int> { 1, 2 } pentru liste, stackalloc int[] { 1, 2 } pentru stivă sau ImmutableArray.Create(1, 2).
Expresiile de Colecție (Collection Expressions) din C# 12 introduc o sintaxă unică, elegantă și performantă folosind parantezele drepte [...], alături de Operatorul Spread (..) pentru concatenarea și inserarea secvențelor existente.
Utilizarea Expresiilor de Colecție și a Operatorului Spread
// 1. Inițializarea simplă a oricărui tip de colecție cu aceeași sintaxă curată:
int[] vector = [1, 2, 3];
List<string> orase = ["București", "Cluj", "Timișoara"];
HashSet<double> valori = [1.5, 2.5, 3.5];
// 2. Alocare directă în Span fără heap allocation:
ReadOnlySpan<byte> antet = [0x47, 0x49, 0x46, 0x38];
// 3. Compoziția secvențelor cu operatorul spread (..):
int[] inceput = [10, 20];
int[] sfarsit = [50, 60];
// Îmbinăm colecțiile într-un nou tablou fără metode greoaie Concat():
int[] total = [..inceput, 30, 40, ..sfarsit];
// Rezultat: [10, 20, 30, 40, 50, 60]
De Ce Expresiile de Colecție Sunt Semnificativ Mai Rapide?
- Capacitate Pre-Calculată: Compilatorul Roslyn analizează dimensiunea elementelor combinate și setează capacitatea finală a listei (
Capacity) de la bun început, eliminând dublările succesive ale buffer-ului intern. - Optimizare Inline pe Stivă: Când ținta este un
ReadOnlySpan<T>, compilatorul plasează datele direct în segmentul de date constante al binarului, cu zero alocări de memorie pe Heap.