params ReadOnlySpan in C# 13
- Matt
Bisher landete jedes Argument einer params-Methode in einem frisch allozierten Array, selbst wenn die Werte die Methode nie verlassen. Seit C# 13 darf die params-Parameterliste auch vom Typ Span<T> oder ReadOnlySpan<T> sein, und der Compiler legt die Werte dafür auf dem Stack statt auf dem Heap ab.
static int Summe(params ReadOnlySpan<int> werte)
{
var summe = 0;
foreach (var wert in werte) summe += wert;
return summe;
}
Summe(1, 2, 3);
Der Haken zeigt sich erst beim Rebuild bestehenden Codes: Gibt es sowohl eine params-Array- als auch eine params-Span-Überladung, bevorzugt der Compiler jetzt die Span-Variante. Die lässt sich aber nicht in einem Expression<Func<...>> verwenden, etwa bei EF-Core-Queries, und bricht dort mit einer Fehlermeldung zu ref structs. Möglich wurde das Ganze erst dadurch, dass Collection Expressions params seit C# 12 für beliebige Sammlungstypen geöffnet haben.