为什么这可以解决我的 Jagged 数组的问题?

Why does this fix the issue w/ my Jagged array?

小序言,我不是专业程序员,我实际上是一名机械工程师,碰巧知道一些编程,这是我在这里的第一个问题,所以请多多包涵。为了简单起见,我只是放了粗略的摘要代码而不是我的实际代码。

我在 vb.net 中有一个锯齿状数组,我用它来跟踪有多少给定化合物通过每个 "zone",其中区域是锯齿状数组的第一个索引。我已经在其他地方初始化了数组:

jagged_arr()() = new double(4)() {}

并且数组的第一个总是预先设置的,例如:

jagged_arr(0) = {1, 2, 3, 4}

所以稍后我将尝试逐个区域地迭代和处理事物,本质上:

for z = 0 to 3
  if z = 2
    jagged_arr(z + 1) = jagged_arr(z)  'NOTE!!!

    for r = 0 to jagged_arr(z + 1).getUpperBound(0)
      'more calcs
      jagged_arr(z + 1)(r) += 2
    next
  end if
next

而不是给我预期的数组:

{{1, 2, 3, 4},
 {1, 2, 3, 4},
 {3, 4, 5, 6},  
 {3, 4, 5, 6},
 {3, 4, 5, 6}}

我得到一个这样的数组:

{{3, 2, 3, 4},
 {3, 2, 3, 4},
 {3, 4, 5, 6},
 {3, 4, 5, 6},
 {3, 4, 5, 6}}

我很困惑为什么会这样。我更困惑为什么在我用这个替换上面提到的行(带有 NOTE!!!)之后它按预期工作:

jagged_array(z + 1) = new double(jagged_array(z).getUpperBound(0)) {}
for i = 0 to jagged_array(z + 1).getUpperBound(0)
  jagged_array(z + 1)(i) = jagged_array(z)(i)
next

我是不是漏掉了什么?我不明白为什么让每个数组最初复制最后一个会导致这种奇怪的行为。感谢您的帮助!

在您将一些 "sub-array" 分配给 "another place" 的第一个代码中进行更改时会发生什么。
通过这样做,您真正做的是分配对该数组的引用,这意味着 jagged_array(z + 1)jagged_array(z) 现在指的是 same 子数组。
另一种说法是两者都成为访问它的别名,因此通过一个所做的任何修改都会反映到另一个访问的对象,因为它们引用 same 事物。

当您更改代码时,您所做的是创建一个 new 对象(新数组)并将初始内容复制到其中 (注意有 Array.Copy for that) 因此它们不引用同一个对象,这意味着通过一个修改表示 jagged_array(z + 1) 不要改变 jagged_array(z)[=15= 引用的对象]