【问题标题】:Why does this fix the issue w/ my Jagged array?为什么这可以解决我的锯齿状阵列的问题?
【发布时间】:2017-02-08 08:03:10
【问题描述】:

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

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

我很困惑为什么会这样。我更困惑为什么在我用这个替换上面提到的行(用 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

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

【问题讨论】:

  • 数组是 .NET 中的引用类型,而不是值类型。您不是在复制数组,而是在复制对 same 数组的引用。

标签: arrays vb.net initialization jagged-arrays


【解决方案1】:

当您进行更改时会发生什么,即在您将一些“子数组”分配给“另一个地方”的第一个代码中。
通过这样做,您真正要做的是分配对该数组的引用,这意味着 jagged_array(z + 1)jagged_array(z) 现在引用 same 子数组。
另一种说法是两者都成为访问它的别名,因此通过一个所做的任何修改都会反映到另一个访问的对象,因为它们引用相同的东西。

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

【讨论】:

  • 但如果是这样,那为什么我的结果不像 {{3, 4, 5, 6}, {3, 4, 5, 6}, {3, 4, 5 , 6}, {3, 4, 5, 6}, {3, 4, 5, 6}} ?
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多