商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > c#如何初始化数组_c#初始化数组的6种方式

c#如何初始化数组_c#初始化数组的6种方式

  发布于2026-07-19 阅读(0)

扫一扫,手机访问

说到C#数组初始化,最常见的方式就是在声明时直接赋值。但别小看这一步,类型推断里其实藏着不少坑。

c#如何初始化数组_c#初始化数组的6种方式

声明时直接赋值初始化,最常见也最直观。比如 int[] arr = new int[] { 1, 2, 3 };,用 new 关键字加大括号,一气呵成。C# 还支持省略类型声明,写成 var arr = new[] { 1, 2, 3 };,编译器会根据初始值自动推断为 int[]。但注意,这里有个陷阱:所有元素必须是同一类型,或者能隐式转换为同一类型,否则编译直接报错。比如 new[] { 1, "hello" } 就会提示 Cannot infer array type

还有一种常见误操作是混用数值和 null,比如 new[] { 42, null }。编译器会将它推断为 object[],而不是预期的 int?string。后续使用很容易引发装箱或空引用异常,这点需要格外当心。

指定长度的数组:必须用 new T[n],不能省略类型

如果只确定数组长度,内容稍后填充,那就必须显式写出类型。比如 string[] names = new string[5];。这里不能写成 var names = new string[5];,语法上就不允许,因为编译器无法从长度推断元素类型。

这种初始化方式下,所有元素会被自动设为默认值:数值类型为 0boolfalse,引用类型为 null。如果想让初始值统一为某个自定义内容,比如全部填 "N/A",那就得手动循环赋值,或者用 .NET 5+ 提供的 Array.Fill() 方法:

  • Array.Fill(names, "N/A");
  • 旧版本可以用 for (int i = 0; i < names.Length; i++) 来逐个赋值。

集合初始化器:小心语法糖的限制

C# 不支持直接用集合初始化器({ ... })来初始化普通数组。像 int[] a = { 1, 2, 3 }; 看似简洁,其实只是编译器提供的语法糖——仅在声明并初始化同时发生时有效。一旦拆成两步就会报错:

int[] a;
a = { 1, 2, 3 }; // ❌ 编译错误:期望 ; 或 =

正确的写法只能是 a = new int[] { 1, 2, 3 };a = [1, 2, 3];(C# 12 的数组字面量语法,但要求目标类型已知)。

另外,集合初始化器对多维数组也无效。比如 int[,] m = { {1,2}, {3,4} }; 是非法的,必须写成 new int[,] { {1,2}, {3,4} }

Enumerable.RepeatEnumerable.Range:适合特定场景

当需要按规律生成数组,比如全零数组、递增序列或重复值,LINQ 提供了一种更函数式的写法。但要注意性能和类型问题:

  • int[] zeros = Enumerable.Repeat(0, 100).ToArray(); —— 创建含 100 个 0 的 int[]
  • int[] range = Enumerable.Range(1, 10).ToArray(); —— 创建 [1..10] 的序列

这些方法返回的是 IEnumerable,调用 ToArray() 才真正生成数组。频繁调用会产生额外的 GC 压力,在简单场景下反而不如传统 for 循环高效。另外,Repeat 的第一个参数是值而非表达式,不能写成 Repeat(new object(), n) 来生成多个独立对象实例——所有元素会指向同一个引用。

数组初始化看起来简单,但类型推断规则、语法糖的适用边界,以及 LINQ 与原生数组的语义差异,都是实际编码中最容易悄悄出错的地方。

本文转载于:https://www.php.cn/faq/2316590.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注