Expresii de Colecție în C# 12: Sintaxa Unificată [..], Operatorul Spread și Performanță în C# (.NET)

Colecții generice C# 12 / .NET 8

Ghid complet pentru Expresiile de Colecție introduse în C# 12: sintaxa unificată cu paranteze drepte [...], compoziția cu operatorul spread (..), optimizările de alocare la compilare și suportul pentru Span.

Sintaxă C#
int[] numere = [1, 2, ..alteNumere]; | ReadOnlySpan<int> span = [10, 20, 30];

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