[C#] .NET10 params collection 可以放入 List 了

2025-12-04

最近在看 C# 14 的更新,看到一個蠻好用的語法。

叫做 "params collection",就是在設計 function 中最後一個引述加入 params

以前的 params 只能吃 基本型態的 array,在實務上其實有點卡特別是要丟物件群、List 的時候更明顯..


以前 params 只能用在 array

你要丟一堆物件進方法,只能這樣寫

void Log(params string[] items) { foreach (var x in items) Console.WriteLine(x); } Log("A", "B", "C");

問題很簡單

實務上我們不常用 array 來處理物件集合

我們用的是 List、Span、ReadOnlySpan

這些原本都不能直接塞進 params

到了 C# 14,多了一個比較順手的寫法..

你可以直接把 "params" 放在 collection 前面

void Log(params List<string> items) { foreach (var x in items) Console.WriteLine(x); } Log(["A", "B", "C"]); </string>

這裡的 ["A", "B", "C"] 是 C# 的 list expression

不用 new List。不用 new string[]。不用轉型

但是實務上最有感的差異是可以直接塞物件

例如做 Validation Pipeline

以前這一段寫法看起來就很硬。

ValidateAll(new IValidator<user>[] { new NameValidator(), new EmailValidator(), new AgeValidator() }); </user>

用 C# 14 的寫法就非常自然。

void ValidateAll(params List<ivalidator ser="">&gt; validators) { foreach (var v in validators) { if (!v.Validate(model)) throw new Exception("Validate fail"); } } ValidateAll([ new NameValidator(), new EmailValidator(), new AgeValidator() ]); </ivalidator>

這種寫法在實務上真的很常見

因為 Validator、Handler、Rule、Step 這些東西本來就會用物件集合來表現

以前為了丟進 params,被迫 new 一個 array 非常不自然

現在用 list expression + params collection 就剛好符合語意。


用 Span 的寫法在 C# 14 看起來很順。

下面快速整理以前 vs 現在的差異。

// C# 13 void Old(params string[] items) { } // C# 14 void New(params List<string> items) { } Old("A", "B"); New(["A", "B"]); </string>

語意差別很簡單。

結論:

C# 14 的 "params collection" 是比想像中更常用的語法糖..

用在 validator..的場景非常自然,也不需要再為了 params 去 new array

搭配 list expression,更像是現代 C# 的自然寫法。整體程式碼變乾淨,也更符合我們日常在寫的集合邏輯..


當麻許的碎念筆記 2014 | Donma Hsu Design.