C#中花括号与方括号数组声明的差异及选型疑问
C#数组声明语法:花括号vs集合表达式的差异、场景与性能
一、语法与适用范围差异
旧式花括号初始化器
{ ... }
仅能用于变量声明时直接赋值,或作为数组构造函数的参数(如new int[] {1,2,3}),不能单独作为表达式使用。
示例:// 合法:声明时赋值 int[] array = {1, 2, 3, 4, 5}; // 合法:配合new作为构造参数 DoSomething(new int[] {1,2,3}); // 非法:不能直接作为方法参数 // DoSomething({1,2,3});集合表达式
[ ... ]
是独立表达式,可在任何需要集合类型的场景直接使用(方法参数、返回值、赋值给不同集合类型等),还支持..语法展开其他集合元素。
示例:// 合法:声明时赋值 int[] array = [1, 2, 3, 4, 5]; // 合法:直接作为方法参数 DoSomething([1,2,3]); // 合法:赋值给非数组集合类型 List<int> list = [1,2,3]; // 合法:展开其他集合拼接元素 int[] otherArr = [4,5]; int[] combined = [1,2,3, ..otherArr];
空数组的特殊情况
- 花括号写法
{}同样受限于声明赋值场景,传递空数组参数必须显式写new int[] {}; - 集合表达式
[]可直接作为空集合表达式使用,自动适配目标类型,比如DoSomething([])可根据方法参数类型传递空数组或空List。
二、场景选择优势
- 优先用集合表达式的场景:
- 需要传递集合作为方法参数、返回集合值时,无需显式
new或指定类型,代码更简洁; - 目标类型不是数组(如
List<T>、HashSet<T>)时,集合表达式可直接适配,无需手动转换; - 需要拼接多个集合元素时,
..展开语法比手动拼接更高效直观。
- 需要传递集合作为方法参数、返回集合值时,无需显式
- 两种写法均可的场景:
仅在变量声明时初始化数组,属于风格偏好问题,遵循团队统一规范即可。
三、性能对比
两种语法在性能上无任何差异:
- 非空数组:编译器会将两种写法编译为完全相同的IL代码,直接创建数组并初始化元素,无额外开销;
- 空数组:C#编译器会缓存空数组实例,
int[] arr = {}和int[] arr = []都会引用同一个缓存的空数组,避免重复创建; - 集合表达式适配非数组集合时,编译后的代码与手动编写的集合初始化器完全一致,性能等价。
内容的提问来源于stack exchange,提问作者SENya
相关产品推荐
相关产品推荐

