2011-05-10 21 views
2

我有以下一段代碼:數組的更改一個元件改變別人

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; } 

正如你可以看到我初始化數組染色體物體。問題是,當我試圖改變的pop所有Genes[k]被改變的pop[i].Genes[k](例如pop[1].Genes[2] = 123)值(即

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

等)

誰能解釋的問題是什麼?
謝謝。 。

+3

創建initialGenes的新副本,它是由於 – manojlds 2011-05-10 16:07:53

+1

你可能要考慮具有染色體類實例化陣列,而不是傳遞一個數組實例的基因突變。正如你所看到的那樣,對相同的數組實例進行多次引用可能會產生意想不到的問題。如果封裝數據並通過GetGene和SetGene方法提供對基因的訪問,染色體不再需要擔心其他代碼可能間接地破壞其狀態。 – 2011-05-10 16:11:31

回答

5

更改您的Chromosome構造,使傳遞進來的數組的副本
我想,你的構造是這樣的:

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

但它應該是這樣的:

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

謝謝。現在,我看到我的錯誤。 – 2011-05-11 09:01:35

2

這是因爲你傳遞同一個對象的所有染色體clases。你應該爲每個染色體類