C# 8.0是否内置构造引用类型数组并初始化每个元素的方法?
回答
好问题!你的自定义ConstructArray函数确实精准解决了引用类型数组初始化的痛点——不用硬编码元素个数,还能保证每个元素都是独立的新实例。在C# 8.0里,你可以用LINQ的组合方法来替代这个自定义函数,无需自己写循环:
推荐的内置解决方案
使用Enumerable.Range配合Select,代码简洁且能达到你的要求:
class Example { const int NumberOfLists = 3; List<int>[] listInit = Enumerable.Range(0, NumberOfLists) .Select(_ => new List<int>()) .ToArray(); }
原理说明
Enumerable.Range(0, NumberOfLists):生成一个从0开始、长度为NumberOfLists的整数序列,用来模拟循环的索引。Select(_ => new List<int>()):对序列中的每个元素(这里不需要索引值,用_作为占位符)创建一个新的TElem实例,确保每个数组元素都是独立对象。ToArray():将最终的序列转换为目标类型的数组。
需要避开的坑
别用Enumerable.Repeat来实现这个需求!对于引用类型,它会重复返回同一个实例,导致所有数组元素指向同一个对象:
// 错误示例!所有List<int>共享同一个实例 List<int>[] badList = Enumerable.Repeat(new List<int>(), NumberOfLists).ToArray();
这种写法看起来简洁,但完全不符合你的需求——往任意一个List添加元素,所有List都会同步变化,一定要避开。
补充说明
C# 8.0本身没有专门的数组初始化语法直接实现“指定长度+每个元素新实例”,但上述LINQ的组合写法已经是内置的、便捷的解决方案,足够替代你的自定义工具函数。
内容的提问来源于stack exchange,提问作者Jason C
相关产品推荐
相关产品推荐

