交错数组 int[][] 是独立类型,声明后仅分配外层数组引用,各子数组需手动初始化,否则访问会抛 NullReferenceException;遍历时须嵌套两层循环,每行长度用 arr[i].Length 获取。

int[][] 不是语法糖,也不是多维数组别名——它是独立类型,必须手动初始化每行,否则访问 jaggedArray[i][j] 会直接抛 NullReferenceException。
声明后必须逐行分配子数组,否则访问就崩
交错数组外层只是引用容器,声明 int[][] arr = new int[3][]; 只分配了 3 个 null 引用,没给任何子数组分配内存。常见错误是跳过初始化直接写 arr[0][0] = 1;,运行时报错。
- 正确做法:先为每行调用
new int[n],再赋值 - 如果某行确实不需要数据,至少显式设为
arr[i] = new int[0];,避免后续遍历时空引用 - 动态场景下(如读取 CSV 行长不一),建议配合
if (arr[i] != null)检查再访问
遍历必须嵌套两层,且内层长度依赖当前行
不能像矩形数组那样用 arr.GetLength(1) 获取列数——交错数组没有统一列维度。每一行的长度是独立的,必须用 arr[i].Length。
- 用
for:外层i ,内层j ,缺一不可 - 用
foreach更安全:先foreach (int[] row in arr),再foreach (int x in row),天然跳过null行(但不会报错,需确认是否符合业务逻辑) - 性能敏感场景慎用
foreach:它会生成迭代器对象,小数组无感,大数量级时for略快
C# 12 的集合表达式让初始化更紧凑,但不改变运行时行为
[ [1, 2], [3, 4, 5], [6] ] 是 C# 12 引入的集合表达式语法,编译后仍是标准交错数组,和 new int[][] { new[] {1,2}, ... } 等价。
- 优势:少写
new和类型重复,可读性高,适合静态数据初始化 - 限制:只能用于初始化,不能用于运行时重赋值;也不能混合类型,比如
[ [1], ["a"] ]编译不过 - 注意:空行必须写成
[],不能省略,否则语法错误
和 int[,] 混用是典型设计误判
看到“二维”就下意识选 int[,],结果遇到不规则数据(比如三角矩阵、稀疏日志记录)立刻卡住——int[,] 所有行长度强制一致,内存连续,无法动态伸缩。
- 选
int[][]的明确信号:行长度不确定、部分行为空、需要单独 resize 某一行、或已有不规则数据源(如 JSON 数组嵌套) - 选
int[,]的明确信号:固定行列、频繁做数学运算(如矩阵乘)、需要GetLength()统一查询维度 - 二者不能隐式转换,传参时类型不匹配会编译失败,别指望自动适配
真正容易被忽略的是:交错数组的“灵活性”代价是责任转移——你得自己管好每一行的生命周期。没初始化、越界访问、混用矩形语义,这些都不是语言隐藏的细节,而是你代码里明晃晃的漏洞点。










