C# 更改数组的一个元素会更改其他元素
我有以下代码:C# 更改数组的一个元素会更改其他元素,c#,arrays,memory,C#,Arrays,Memory,我有以下代码: Chromosome[] pop = new Chromosome[popSize]; int[] initialGenes = new int[i]; for (int m = 0; m < i; m++) initialGenes[m] = -1; for (int j = 0; j < popSize; j++) { pop[j] = new Chromos
Chromosome[] pop = new Chromosome[popSize];
int[] initialGenes = new int[i];
for (int m = 0; m < i; m++)
initialGenes[m] = -1;
for (int j = 0; j < popSize; j++)
{
pop[j] = new Chromosome(graph, initialGenes);
}
如您所见,我初始化了一个染色体对象数组。问题是当我试图更改pop[I]的值时,基因[k]
(例如pop[1]。基因[2]=123
)所有pop
的基因[k]
都被更改(即
)
有人能解释一下问题出在哪里吗?谢谢。更改您的
染色体的构造函数,以复制传入的数组。
我假设,您的构造函数如下所示:
public Chromosome(int[] initialGenes)
{
Genes = initialGenes;
}
public Chromosome(int[] initialGenes)
{
Genes = new int[initialGenes.Length];
Array.Copy(initialGenes, Genes, Genes.Length);
}
但它应该是这样的:
public Chromosome(int[] initialGenes)
{
Genes = initialGenes;
}
public Chromosome(int[] initialGenes)
{
Genes = new int[initialGenes.Length];
Array.Copy(initialGenes, Genes, Genes.Length);
}
发生这种情况是因为将同一对象传递给所有染色体分支。您应该为每个染色体类< /p>创建新的副本,您可能需要考虑将染色体类实例化数组而不是传递到数组实例中。正如您所看到的,对同一数组实例进行多个引用可能会产生意外问题。如果您封装数据并通过GetGene和SetGene方法提供对基因的访问,染色体就不必担心其他代码会间接破坏其状态。谢谢。现在我明白我的错误了。