C#中数组声明要求方括号紧跟类型(如int[]),而非变量名后;多维数组需区分矩形(int[,])与交错(int[][]);初始化有三种等效写法;长度统一用.Length属性。

声明数组时方括号必须紧跟类型,不能放在变量名后
这是 C# 和 C/C++ 最容易混淆的点之一。写 int[] arr 是合法的,而 int arr[] 会直接编译失败,报错 Syntax error, ']' expected。原因在于 C# 把 [] 视为类型修饰符,属于 int[] 这个完整类型的一部分,不是变量声明语法糖。
常见错误现象:
- 从 Java 或 C 转过来的人习惯写
string args[],结果编译不过 - 定义多维数组时误写成
int[,] arr却漏掉逗号,变成int[] arr,实际想用二维却用了交错数组语法
正确写法示例:
int[] numbers; string[,] grid; double[][] jagged; // 注意:这是交错数组,不是矩形二维
初始化一维数组的三种等效写法及其适用场景
这三种写法语义一致,但编译器推导行为和可读性不同,选错可能影响维护性。
-
int[] a = new int[5];:只分配空间,所有元素初始化为0。适合后续循环赋值或需要默认值的场景 -
int[] b = new int[] {1, 2, 3};:显式指定长度(可省略),适用于已知全部初始值且希望强调“构造即初始化” -
int[] c = {1, 2, 3};:最简写法,new和类型均可省略,但**只能用于声明同时初始化**,不能用于后续赋值(如c = {4,5,6};会报错)
注意:new int[] 中的长度若与大括号内元素数不一致(如 new int[2]{1,2,3}),编译直接拒绝;而 new int[3] 后再手动赋值则无此限制。
区分矩形二维数组(int[,])和交错数组(int[][])
两者都叫“二维”,但内存布局、初始化方式和 Length 含义完全不同,混用会导致越界或逻辑错误。
-
int[,] rect = new int[2,3];:固定行列的矩形结构,共 6 个元素。rect.Length返回6,rect.Rank为2,访问用rect[0,1] -
int[][] jagged = new int[2][];:先创建含 2 个元素的一维数组,每个元素是int[]类型,需单独初始化,如jagged[0] = new int[3]; jagged[1] = new int[5];。此时jagged.Length是2(外层数组长度),jagged[0].Length才是第一行长度
常见坑:
- 误把
int[,]当作int[][]使用jagged[i][j]访问 → 编译错误 - 对
int[,] grid调用grid.GetLength(0)得行数,grid.GetLength(1)得列数;但若错用grid.Length以为是行数,实际是总元素数
获取数组长度必须用 .Length,别用 sizeof 或 Count()
sizeof(a)/sizeof(*a) 是 C 语言惯用法,在 C# 中完全无效 —— sizeof 仅支持非托管类型且不能用于数组变量,强行使用会编译报错 CS0233: 'xxx' does not have a predefined size。
- 一维/多维数组统一用
arr.Length:返回总元素个数(不是字节数) - 需要各维度长度时,用
arr.GetLength(dimensionIndex),例如arr.GetLength(0)是第一维长度 -
arr.Count()来自 LINQ,需引用System.Linq,且对数组是 O(1) 的包装调用,但引入额外依赖,纯数组操作没必要
特别注意:字符串的 .Length 是属性,数组的 .Length 也是属性,二者行为一致;但 string.Length 返回字符数,int[].Length 返回元素个数 —— 这一点在处理 byte[] 和 string 编码互转时容易出错。


















