如何在C#中从另一个数组创建一个新数组(副本)

时间:2013-12-29 21:28:13

标签: arrays vb.net binding types reference

我在VB.net中声明了一些二维数组,如下所示:

Public TrainingSet_Inputs()() As Double
Public TrainingSet_Outputs()() As Double

Public OriginalData_Inputs()() As Double
Public OriginalData_Outputs()() As Double

然后在sub中创建另一组数组,如下所示:

    Dim Inputs()() As Double
    Dim Outputs()() As Double

我将信息存储到其中,之后我做了以下修改和分配:

    ' store original data
    OriginalData_Inputs = Inputs
    OriginalData_Outputs = Outputs

    TrainingSet_Inputs = normalise(Inputs)
    TrainingSet_Outputs = normalise(Outputs)

在执行规范化后,似乎会修改OriginalData数组中的值以匹配TrainingSet。从我的数组定义方式来预期这种行为吗?没有其他代码我将OriginalData分配给TrainingSet。

编辑:

我现在明白数组是引用类型,并且已经将问题标题修改为我认为更有用的搜索项。

2 个答案:

答案 0 :(得分:2)

通过键入Array1 = Array2,您只需设置引用,不要复制值。 使用

    Dim OriginalData_Inputs As Double(Inputs.Count-1)()
    For i = 0 To Inputs.Count - 1
        OriginalData_Inputs(i) = Inputs(i).Clone
    Next

这实际上创建了所有数组的副本,而不仅仅是创建引用。它应该工作。

答案 1 :(得分:2)

数组类型为reference types而不是value types 引用类型的变量存储对其数据的引用。

我可以用非常简单的方式解释你的情况:

假设在初始化(新)之后,六个数组具有不同的引用值,如下所示:

TrainingSet_Inputs       --> has a reference value of 2000
TrainingSet_Outputs      --> has a reference value of 4000
OriginalData_Inputs      --> has a reference value of 6000
OriginalData_Outputs     --> has a reference value of 8000
Inputs                   --> has a reference value of 10000
Outputs                  --> has a reference value of 12000

我们可以将这些引用想象成内存中存储这些虚构值的4个字节,这些虚构值是指向存储数组实际值的内存位置的指针。

分配时

 OriginalData_Inputs = Inputs
 OriginalData_Outputs = Outputs

您已更改OriginalData数组的参考值。 (旧的值指向的先前内存将在此调用后的某个时间由Garbage Collector释放)

TrainingSet_Inputs       --> has a reference value of 2000
TrainingSet_Outputs      --> has a reference value of 4000
OriginalData_Inputs      --> has a reference value of 10000 
OriginalData_Outputs     --> has a reference value of 12000
Inputs                   --> has a reference value of 10000
Outputs                  --> has a reference value of 12000

现在,接下来发生的事情取决于方法normalise,但我想这个方法只返回对输入数组的相同引用,因此你的情况变得

TrainingSet_Inputs       --> has a reference value of 10000
TrainingSet_Outputs      --> has a reference value of 12000
OriginalData_Inputs      --> has a reference value of 10000
OriginalData_Outputs     --> has a reference value of 12000
Inputs                   --> has a reference value of 10000
Outputs                  --> has a reference value of 12000

所有Inputs数组现在具有相同的参考值,因此对于Outputs数组