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方法提供对基因的访问,染色体就不必担心其他代码会间接破坏其状态。谢谢。现在我明白我的错误了。