【问题标题】:Changing one element of an array changes others更改数组的一个元素会更改其他元素
【发布时间】:2011-08-22 14:47:58
【问题描述】:

我有以下代码:

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 

等等)

谁能解释一下问题出在哪里?
谢谢。

【问题讨论】:

  • 您可能需要考虑让 Chromosome 类实例化数组,而不是传入数组实例。如您所见,对同一数组实例进行多次引用可能会产生意想不到的问题。如果您封装数据并通过 GetGene 和 SetGene 方法提供对基因的访问,则染色体不再需要担心其他代码可能会间接破坏其状态。

标签: c# arrays memory


【解决方案1】:

更改Chromosome 的构造函数以复制传入的数组。
我假设,您的构造函数如下所示:

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

但它应该是这样的:

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

【讨论】:

  • 谢谢。现在我看到了我的错误。
【解决方案2】:

发生这种情况是因为您将相同的对象传递给所有染色体分类。您应该为每个 Chromosome 类创建 initialGenes 的新副本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多