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

时间:2016-09-29 20:47:34

标签: arrays vb.net initialization jagged-arrays

小前言,我不是程序员,我实际上是一名机械工程师,碰巧知道某些编程,这是我的第一个问题,所以请忍受我。我只是简单地使用粗略的摘要代码而不是实际的代码来保持简单。

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

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}}

我很困惑为什么会发生这种情况。我更加困惑的是,为什么它在我用以下方法替换上面提到的线路(注意!!!)之后按预期工作:

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

我在这里遗漏了什么吗?我不知道为什么每个数组最初复制最后一个导致这种奇怪的行为。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

当您进行更改时会发生的情况是您将一些“子阵列”分配给“另一个地方”的第一个代码。
通过这样做你真正做的是分配对该数组的引用意味着jagged_array(z + 1)jagged_array(z)现在引用相同的子数组。
设置它的另一种方法是成为访问它的别名,因此通过one进行的任何修改都会反映到另一个访问的对象,因为它们引用了相同的事物。

当您更改代码时,您要创建一个 new 对象(新数组)并将初始内容复制到其中(注意Array.Copy为此<) / em>因此他们没有引用相同的对象意味着通过一个人来说修改jagged_array(z + 1)不会改变jagged_array(z)引用的对象