使用集合表达式定义List时会调用哪个构造函数?
C#集合表达式生成List时的构造函数选择
当你使用集合表达式创建List<T>时,编译器的行为取决于元素数量是否在编译时可确定:
- 固定数量的字面元素集合:比如
[a, b, c]这种明确写出所有元素的情况,编译器会直接调用List(int capacity)构造函数,传入的容量等于元素的实际数量。这和你手动使用new List<T>(X)的效果完全一致,不会有默认容量带来的扩容开销。 - 动态数量的集合:如果集合表达式的元素来自动态枚举(比如
[..someEnumerable]),或者元素数量无法在编译期确定,编译器会先调用默认的List()构造函数(初始容量为4),再通过AddRange或逐个添加元素的方式填充列表,这种情况下可能会触发自动扩容。
举个具体的代码对比:
// 编译后等价于 new List<int>(3) var fixedSizeList = [1, 2, 3]; // 编译后等价于先new List<int>(),再AddRange(Enumerable.Range(1, 5)) var dynamicSizeList = [.. Enumerable.Range(1, 5)];
所以只要你的集合表达式是明确的固定元素列表,编译器会自动帮你优化到指定容量的构造函数,完全不用手动处理,既简化了代码又保留了性能优势。
内容的提问来源于stack exchange,提问作者John Demetriou
相关产品推荐
相关产品推荐

