小前言,我不是程序员,我实际上是一名机械工程师,碰巧知道某些编程,这是我的第一个问题,所以请忍受我。我只是简单地使用粗略的摘要代码而不是实际的代码来保持简单。
我在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
我在这里遗漏了什么吗?我不知道为什么每个数组最初复制最后一个导致这种奇怪的行为。任何帮助表示赞赏!
答案 0 :(得分:0)
当您进行更改时会发生的情况是您将一些“子阵列”分配给“另一个地方”的第一个代码。
通过这样做你真正做的是分配对该数组的引用意味着jagged_array(z + 1)
和jagged_array(z)
现在引用相同的子数组。
设置它的另一种方法是成为访问它的别名,因此通过one进行的任何修改都会反映到另一个访问的对象,因为它们引用了相同的事物。
当您更改代码时,您要创建一个 new 对象(新数组)并将初始内容复制到其中(注意Array.Copy
为此<) / em>因此他们没有引用相同的对象意味着通过一个人来说修改jagged_array(z + 1)
不会改变jagged_array(z)
引用的对象