为何C#中索引操作会修改整列元素而非单个元素?
问题原因解析
你遇到的问题核心是引用类型的复用,具体原因如下:
错误初始化方式的问题点
这段代码:
int[][] m_dist = Enumerable.Repeat(Enumerable.Repeat(-1, m.Length).ToArray(), m.Length).ToArray();
执行逻辑是:
- 先执行
Enumerable.Repeat(-1, m.Length).ToArray(),创建一个int[]类型的数组实例,所有元素初始化为-1。 - 外层的
Enumerable.Repeat(..., m.Length)只是把这个同一个数组的引用重复了m.Length次,最终转成二维数组后,m_dist的每一行都指向这个唯一的数组实例。
所以当你执行m_dist[1][1] = 0时,本质是修改了这个共享数组的第2个元素,而二维数组的所有行都引用它,自然所有行的对应位置都会同步变成0。
循环初始化为什么正常
循环代码里:
int[][] m_dist = new int[m.Length][]; for (int i = 0; i < m_dist.Length; i++) { m_dist[i] = new int[m.Length]; for (int j = 0; j < m_dist[i].Length; j++) { m_dist[i][j] = -1; } }
每次循环到m_dist[i] = new int[m.Length]时,都会创建一个全新的int[]数组实例,二维数组的每一行都是独立的数组,互相没有引用关联。修改某一行的元素只会影响当前行,不会波及其他行。
内容的提问来源于stack exchange,提问作者nadasdi
相关产品推荐
相关产品推荐

