2013-04-23 52 views
3

我目前正在編寫一個Tetris應用程序。我爲我的寶石使用了一個多維整數數組,它們表示它們在多維面板字段(int [row] [colum])上的位置。設置兩個多維數組的行爲等於

我現在在這裏,我想更新我的領域顏色,當一塊石頭向下移動時。我不想循環所有的字段和所有的俄羅斯方塊石頭,而只是更新當前的石頭,所以我在最後一個位置添加了一個變量。 但我在設置這個變量時遇到一些問題!

我現在的問題是,爲什麼做這項工作:

public void moveDown() 
{ 
    for (int i = 0; i < location.Length; i++) 
    { 
     last_location[i][0] = location[i][0]; 
     last_location[i][1] = location[i][1]; 
     location[i][0] += 1; 
    } 
} 

但這並不:這裏是

public void moveDown() 
{ 
    last_location = location; 
    for (int i = 0; i < location.Length; i++) 
    { 
     location[i][0] += 1; 
    } 
    //last_location got also updated?? 
} 

的問題,該循環中,last_location竟完全相同的後值作爲位置變量,之後變爲! 爲什麼? 在此先感謝!

+0

什麼類型的'last_location'和' location'? 'INT [] []'? – Jodrell 2013-04-23 11:41:20

+0

是的,他們都是int [] []! – Yami 2013-04-23 11:41:50

+2

你給'last_location'一個參考'location' – DGibbs 2013-04-23 11:41:58

回答

4

Array is a reference type。

因此,當您編寫last_location = location;,時,您不會創建數組的副本。 last_location使用與location相同的數組實例。

所以當你修改兩個變量中的一個時,在內存中修改同一個唯一實例。

+0

謝謝!我現在明白了:) 有沒有辦法,在創建副本的同時不要添加引用? (沒有做這個循環?) – Yami 2013-04-23 11:46:05

+0

@Yami,我已經添加了一個副本的例子到我的答案。 – Jodrell 2013-04-23 12:10:42

1

在第二個示例中,您分配引用,同時在第一個示例中分配值。

當你這樣做last_location = location;你指定你的變量last_location指向你的位置,所以當你改變位置值時,因爲last_location指向的位置,在你看來這些它的值也是變化的。 last_location位置單個內存分區

在第一種情況下last_location [I] [0] =位置[I] [0]你在循環分配值,而不是referrences,所以你last_location位置點上不同存儲器分區具有不同的值。

2

當您指定last_locationlocation引用的對象,

last_location = location; 

你再有兩個引用同一個對象。 last_location引用的對象不再被引用,並會在適當的時候進行垃圾回收。


達到你想要的最快的方法是並初始化last_location到相同尺寸location和使用Buffer.BlockCopy

例如,

var location = new [] 
    { 
     new int[10], 
     new int[10] 
    }; 

var last_location = new [] 
    { 
     new int[10], 
     new int[10] 
    }; 

Buffer.BlockCopy(location, 0, last_location, 0, location.Length * sizeof(int));