淺談 C# 13 中的 Params 集合
前言
在 C# 13 中,params 的改進(jìn)使其從可變數(shù)量的數(shù)組參數(shù)升級(jí)為可變數(shù)量的集合類型參數(shù)。這一改進(jìn)通過(guò)支持高性能集合類型(如Span<T>,ReadOnlySpan<T>)和簡(jiǎn)化調(diào)用語(yǔ)法,顯著提升了代碼的靈活性和效率。
params的適用場(chǎng)景
params適用于參數(shù)個(gè)數(shù)動(dòng)態(tài)變化的場(chǎng)景,例如日志、數(shù)學(xué)計(jì)算或格式化輸出等,減少冗余代碼,增強(qiáng)方法通用性。
C# 13 的改進(jìn)與舊版本對(duì)比
在 C# 13 之前:
params 僅支持一維數(shù)組(如params int[] list、params object[] list)。調(diào)用方法時(shí)需顯式傳遞數(shù)組或數(shù)組元素類型的參數(shù)的逗號(hào)分隔列表。
在 C# 13 中:
params 修飾符并不局限于數(shù)組類型。 現(xiàn)在可以將 params 用于任何已識(shí)別的集合類型,包括 System.Span<T>、System.ReadOnlySpan<T>,以及那些實(shí)現(xiàn) System.Collections.Generic.IEnumerable<T> 并具有 Add 方法的類型。 除了具體類型外,還可以使用接口 System.Collections.Generic.IEnumerable<T>、System.Collections.Generic.IReadOnlyCollection<T>、System.Collections.Generic.IReadOnlyList<T>、System.Collections.Generic.ICollection<T>和 System.Collections.Generic.IList<T>。
注意事項(xiàng)
在方法聲明中的 params 關(guān)鍵字之后不允許有任何其他參數(shù),并且在方法聲明中只允許有一個(gè) params 關(guān)鍵字。
性能基準(zhǔn)測(cè)試
下面我們使用一個(gè)數(shù)據(jù)求和場(chǎng)景,對(duì)C# 13 之前和C# 13 中的改進(jìn)方式使用BenchmarkDotNet做一下性能基準(zhǔn)測(cè)試對(duì)比:
[MemoryDiagnoser]//記錄內(nèi)存分配情況
[MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter]
public class ParamsBenchmark
{
private List<int> dataList = new();
/// <summary>
/// 初始化測(cè)試數(shù)據(jù)
/// 如創(chuàng)建大型數(shù)據(jù)集、分配內(nèi)存資源等,避免在每次基準(zhǔn)測(cè)試迭代中重復(fù)初始化帶來(lái)的性能干擾
/// </summary>
[GlobalSetup]
public void Setup()
{
dataList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 9, 10, 22, 55, 66, 88, 44, 66, 33, 77, 54, 24, 8789, 24, 54, 244, 377, 26, 99, 888, 1000 };
}
[Benchmark]
public int CalculateOldSum()
{
return OldSumArray(dataList.ToArray());
}
[Benchmark]
public int CalculateNewSumList()
{
return NewSumList(dataList);
}
/// <summary>
/// C# 13 之前
/// </summary>
/// <param name="datas">datas</param>
/// <returns></returns>
public int OldSumArray(params int[] datas)
{
return datas.Sum();
}
/// <summary>
/// C# 13 中
/// </summary>
/// <param name="datas">datas</param>
/// <returns></returns>
public int NewSumList(params List<int> datas)
{
return datas.Sum();
}
}
基準(zhǔn)測(cè)試報(bào)告
圖片
- Mean: 所有測(cè)量值的算術(shù)平均值。
- Error: 99.9% 置信區(qū)間的一半。
- StdDev: 所有測(cè)量值的標(biāo)準(zhǔn)差。
- Gen0: 第 0 代 GC 每 1000 次操作收集一次。
- Allocated: 每次操作分配的內(nèi)存(僅托管內(nèi)存,包含所有內(nèi)容,1KB = 1024B)。
最后總結(jié)
綜上所述C# 13 中的 params 集合變得類型更靈活,滿足更復(fù)雜的應(yīng)用場(chǎng)景,并且性能得到了進(jìn)一步的提升。