更改数组的一个元素会更改其他元素

时间:2011-05-10 16:01:53

标签: 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 Chromosome(graph, initialGenes);  
     }  

Chromosome是我的班级,有一个属性

public int[] Genes { get; set; }

如您所见,我初始化了一个Chromosome对象数组。问题是,当我尝试更改pop[i].Genes[k]的值(例如pop[1].Genes[2] = 123)时Genes[k]的所有pop都发生了变化(即

pop[0].Genes[2] == 123
pop[2].Genes[2] == 123 

等)

有人可以解释问题是什么吗? 感谢。

2 个答案:

答案 0 :(得分:5)

更改Chromosome的构造函数以制作传入的数组的副本。
我假设,你的构造函数看起来像这样:

public Chromosome(int[] initialGenes)
{
    Genes = initialGenes;
}

但它应该是这样的:

public Chromosome(int[] initialGenes)
{
    Genes = new int[initialGenes.Length];
    Array.Copy(initialGenes, Genes, Genes.Length);
}

答案 1 :(得分:2)

这是因为您将同一个对象传递给所有Chromosome类。您应该为每个染色体类创建初始基因的新副本